2017-07-19 13 views
6

私は使用していたbase64でエンコードされた資格情報が気に入らなかったので、あまりにも多くの時間をSMTPサーバーに対して叩いてしまった。それは、私が使用しないと言ったときに、インターネット上の多くの指示が使用すると言ったように、私は大きな間違いをしていました。どうしてこれなの?私はbase64が単一の標準だと思った。base64とMIMEベース64の違いは何ですか?

は考えてみましょう:

$ 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 

ので、perlは、その出力で一意であり、私のサーバーは、そのように要求します。

なぜ私は異なる結果を得ていますか?

どのようにしてperl以外のものでMIME/SMTPフレンドリーな出力を得るのですか?

+0

等価は以下のようになり、 'perlの-MMIME :: Base64で-0777pe'print encode_base64($ _) '' – ikegami

答えて

10

これはPerl対他のすべてのものではありません。これは「Bashの<<<構文を使用する」対「それをしない」ことです。明示的には文書化されていませんが(少なくともUbuntu Xenialのマンページにはありません)、Bash appends a newline to herestrings (the <<< thing) when passing them to commands。結果として、<<<で呼び出されているすべてのコマンドは実際には'ASDF1234asdf\n'をエンコードしますが、Perl(この文字列では呼び出されません)はちょうど'ASDF1234asdf'のエンコードです。異なる入力、異なる出力。例えば、コマンドの標準入力に改行せずに文字列を渡すprintfコマンドを使用するためには

$ printf %s ASDF1234asdf | base64 
QVNERjEyMzRhc2Rm 
5

、そこには別のbase64でエンコードされるものではないが、最後に改行文字をコード化しますかどうか:

$ 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

これは非常に簡潔なデモです。エコーコマンドに改行の抑制とエスケープ文字の解釈を追加して、OPと同じ結果を生成しました。 (そして上書きされた) –

関連する問題