作为工作项目的一部分,我将Perl库移植到Python。我对Python感到很满意,Perl很少(很多)。
perl代码使用Digest::MD5。该模块有三个功能:
md5($data)
接收数据并在二进制文件中吐出md5摘要 md5_hex($data)
接收数据并在 hex md5_base64($data)
接收数据并以base64编码方式吐出md5摘要我可以用这样的东西复制md5_hex:
import hashlib
string = 'abcdefg'
print(hashlib.md5(string.encode()).hexdigest())
哪个工作正常(相同的输入至少提供相同的输出)。我似乎没有任何东西可以匹配其他两个功能。
字符串编码实际上不是我做过的事情并没有帮助。我一直在解释perl函数说他们采用md5摘要然后重新编码二进制或base64,如下所示:
import hashlib
import base64
string = 'abcdefg'
md5_string = hashlib.md5(string.encode()).hexdigest()
print(base64.b64encode(md5_string))
但也许这是错的?我确信有一些基本的东西我只是缺席了。
Perl doc在这里: https://metacpan.org/pod/Digest::MD5
答案 0 :(得分:3)
第一个只是在.digest
上调用md5
方法:
>>> from hashlib import md5
>>> s = 'abcdefg'
>>> md5(s.encode()).digest()
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md'
md5_base64
是摘要,但是base64编码:
>>> base64.b64encode(md5(s.encode()).digest())
b'esZsDxSN6VGbi9JkMSxNZA=='
但是,Perl不会返回填充的哈希值,因此为了兼容,您将删除=
填充字符:
>>> base64.b64encode(md5(s.encode()).digest()).strip(b'=')
b'esZsDxSN6VGbi9JkMSxNZA'
答案 1 :(得分:0)
首先,请注意Digest::MD5文档:
请注意,返回的base64编码字符串未填充为4个字节长的倍数。如果您希望与其他base64编码的md5摘要进行互操作,则可能需要将冗余字符串“==”附加到结果中。
其次,请注意您希望Base64对哈希进行编码,而不是它的十六进制表示:
print(base64.b64encode(hashlib.md5(string.encode()).digest()))
esZsDxSN6VGbi9JkMSxNZA==
perl -MDigest::MD5=md5_base64 -E 'say md5_base64($ARGV[0])' abcdefg
esZsDxSN6VGbi9JkMSxNZA