base64和MIME base 64有什么区别?

时间:2017-07-19 21:20:08

标签: python linux shell perl mime

我花了太多时间对着SMTP服务器,因为它不喜欢我使用的base64编码凭据。事实证明,当我选择不使用perl像互联网上那么多指令一样使用时,我犯了一个大错误。为什么是这样?我认为base64是一个标准。

考虑:

$ 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('my_user_name@my_domain.com')"
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20=

$ base64 <<<"my_user_name@my_domain.com"
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K

因此,perl在输出中是唯一的,我的服务器就是这样。

为什么我会得到不同的结果?

如何使用perl以外的其他方式获取MIME / SMTP友好输出?

2 个答案:

答案 0 :(得分:11)

这不是Perl与其他人的事情;这是&#34;使用Bash的<<<构造&#34;与#34;不这样做&#34;事情。虽然没有明确记录(至少不在Ubuntu Xenial的联机帮助页中),Bash appends a newline to herestrings (the <<< thing) when passing them to commands。因此,您使用<<<调用的所有命令实际上都是'ASDF1234asdf\n'编码,而Perl(不是用herestring调用)只编码'ASDF1234asdf' }。不同的输入,不同的输出。

为了将没有尾随换行符的字符串传递给命令的标准输入,请使用printf命令,例如:

$ printf %s ASDF1234asdf | base64
QVNERjEyMzRhc2Rm

答案 1 :(得分:5)

没有不同的base64编码,但最后是否编码换行符:

$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf")'
QVNERjEyMzRhc2Rm
$ perl -MMIME::Base64 -e 'print encode_base64("ASDF1234asdf\n")'
QVNERjEyMzRhc2RmCg==
$ echo -ne "my_user_name@my_domain.com" | base64
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20=
$ echo -ne "my_user_name@my_domain.com\n" | base64
bXlfdXNlcl9uYW1lQG15X2RvbWFpbi5jb20K
相关问题