Python 相当于 Perl Digest::MD5 函数

Python equivalent of Perl Digest::MD5 functions

作为工作项目的一部分,我正在将 Perl 库移植到 Python。我对 Python 很满意,但对 Perl 的感觉要差很多。

perl 代码使用 Digest::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 文档在这里: https://metacpan.org/pod/Digest::MD5

第一个只是调用 md5 上的 .digest 方法:

>>> 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 不会 return 散列填充,因此为了兼容,您需要去除 = 填充字符:

>>> base64.b64encode(md5(s.encode()).digest()).strip(b'=')
b'esZsDxSN6VGbi9JkMSxNZA'

首先,注意 Digest::MD5 文档:

Note that the base64 encoded string returned is not padded to be a multiple of 4 bytes long. If you want interoperability with other base64 encoded md5 digests you might want to append the redundant string "==" to the result.

其次,请注意您要对哈希进行 Base64 编码,而不是它的十六进制表示:

print(base64.b64encode(hashlib.md5(string.encode()).digest()))

esZsDxSN6VGbi9JkMSxNZA==

perl -MDigest::MD5=md5_base64 -E 'say md5_base64($ARGV[0])' abcdefg

esZsDxSN6VGbi9JkMSxNZA