2017-07-19 3 views
6

Ich habe gerade viel zu viel Zeit damit verbracht, meinen Kopf gegen einen SMTP-Server zu schlagen, weil er die base64-verschlüsselten Anmeldedaten, die ich benutzte, nicht mochte. Stellt sich heraus, dass, wenn ich wählte, um perl nicht zu verwenden, wie so viele Anweisungen im Internet sagen zu verwenden, machte ich einen großen Fehler. Warum ist das? Ich dachte, Base64 sei ein einziger Standard.Was ist der Unterschied zwischen base64 und MIME base 64?

Bedenken Sie:

$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")' 
QVNERjEyMzRhc2Rm 

$ base64 <<<"ASDF1234asdf" 
QVNERjEyMzRhc2RmCg== 

$ python3.6 -m base64 <<<"ASDF1234asdf" 
QVNERjEyMzRhc2RmCg== 

$ python2.7 -m base64 <<<"ASDF1234asdf" 
QVNERjEyMzRhc2RmCg== 

$ perl -MMIME::Base64 -e "print encode_base64('[email protected]_domain.com')" 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20= 

$ base64 <<<"[email protected]_domain.com" 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K 

So ist perl einzigartig in seiner Leistung und mein Server erfordert es so.

Warum erhalte ich unterschiedliche Ergebnisse?

Wie erhalten Sie die MIME/SMTP freundliche Ausgabe mit etwas anderem als Perl?

+0

Äquivalent wäre 'perl -MMIME :: Base64 -0777pe'print encode_base64 ($ _) '' – ikegami

Antwort

10

Dies ist kein Perl gegen alle anderen Sache; Dies ist ein "mit Bash <<< Konstrukt" vs. "nicht das tun" -Sache. Obwohl nicht explizit dokumentiert (zumindest nicht in der Manpage auf Ubuntu Xenial), Bash appends a newline to herestrings (the <<< thing) when passing them to commands. Als Ergebnis codieren alle Befehle, die Sie mit <<< aufrufen, tatsächlich 'ASDF1234asdf\n', während Perl (das nicht mit einem Herestring aufgerufen wird) nur 'ASDF1234asdf' codiert. Unterschiedlicher Eingang, unterschiedlicher Ausgang.

Um eine Zeichenkette ohne Hinter Neue-Zeile auf einen Befehl der Standardeingabe übergibt, verwendet den printf Befehl, zB:

$ printf %s ASDF1234asdf | base64 
QVNERjEyMzRhc2Rm 
5

Es sind keine unterschiedlichen Base64-Codierungen, aber ein Neues-Zeile-Zeichen am Ende codieren, oder nicht:

$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")' 
QVNERjEyMzRhc2Rm 
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf\n")' 
QVNERjEyMzRhc2RmCg== 
$ echo -ne "[email protected]_domain.com" | base64 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20= 
$ echo -ne "[email protected]_domain.com\n" | base64 
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K 
+0

Dies ist eine sehr kurze Demo. Ich fügte dem echo-Befehl Zeilenumbruch- und Escape-Zeichen-Interpretation hinzu, um Ergebnisse zu erzeugen, die mit dem OP identisch sind. (und aufgewertet) –

Verwandte Themen