2017-07-19 60 views
6

Kullandığım base64 kodlu kimlik bilgilerini beğenmediğim için kafamı bir SMTP sunucusuna çarptırarak çok fazla zaman harcadım. Çıktığında, internette kullanmak istediği kadar çok yönerge gibi perl'u kullanmayı tercih etmediğimde büyük bir hata yapıyordum. Bu neden? Base64'ün tek bir standart olduğunu sanıyordum.base64 ve MIME base 64 arasındaki fark nedir?

düşünün:

$ 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 

Yani, perl çıktısı tektir ve benim sunucu bu şekilde gerektirir.

Neden farklı sonuçlar alıyorum?

MIME/SMTP dostu çıktıları perl'den başka biriyle nasıl edinirsiniz?

+0

Eşdeğer olacağını 'perl -MMIME :: Base64 -0777pe'print encode_base64 ($ _) '' – ikegami

cevap

10

Bu herkesin başına bir Perl değildir; Bu "Bash'in <<< yapısını" kullanarak "bunu yapmama" şeyidir. Açıkça belgelenmemiş olsa da (en azından Ubuntu Xenial'daki manpage'de değil), Bash appends a newline to herestrings (the <<< thing) when passing them to commands. Sonuç olarak, <<< ile çağırdığınız tüm komutlar aslında 'ASDF1234asdf\n' kodlaması yaparken, Perl (bir herestring ile çağrılmayan) sadece 'ASDF1234asdf' kodlamasıdır. Farklı giriş, farklı çıkış. printf komutunu kullanın komutun standart girdisine bir sondaki yeni satır olmadan bir dize geçmek için

, örneğin:

$ printf %s ASDF1234asdf | base64 
QVNERjEyMzRhc2Rm 
5

Hiçbir farklı base64 kodlamaları vardır, ama sonunda bir satır karakteri kodlayan, ya da değil:

$ 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

Bu çok özlü demo. OP ile aynı sonuçları üretmek için yeni satır bastırma ve yankı komutuna karakter yorumlama özelliğini ekledim. (ve yükseltilmiş) –