【问题标题】:Python equivalent of Perl Digest::MD5 functionsPython等效Perl Digest :: MD5函数
【发布时间】:2017-02-26 22:20:12
【问题描述】:

作为工作项目的一部分,我将一个 Perl 库移植到 Python。我对 Python 很满意,而对 Perl 则要少得多。

perl 代码使用Digest::MD5。该模块具有三个功能:

  • md5($data) 接收数据并在 binary 中输出 md5 摘要
  • md5_hex($data) 接收数据并在 hex 中输出 md5 摘要
  • 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 文档在这里: https://metacpan.org/pod/Digest::MD5

【问题讨论】:

  • 显然,您不想对哈希的十六进制表示进行 Base64 编码,而是对哈希本身进行编码。
  • 如果要计算大文件的MD5,可以考虑这个方案:stackoverflow.com/questions/1131220/…

标签: python string perl encoding md5


【解决方案1】:

第一个只是在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 不返回填充的哈希值,因此为了兼容,您需要去除 = 填充字符:

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

【讨论】:

  • md5(s.encode()).digest() 等价于md5 而不是md5_hex
【解决方案2】:

首先,注意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

【讨论】:

  • 我选择了 Antti Haapala 的答案,因为他也涵盖了二进制情况,但这对于 base64 部分非常有用。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多