Python相当于Perl Digest :: MD5函数

时间:2016-10-17 20:03:42

标签: python string perl encoding md5

作为工作项目的一部分,我将Perl库移植到Python。我对Python感到很满意,Perl很少(很多)。

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

  • md5($data)接收数据并在二进制文件中吐出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 doc在这里: https://metacpan.org/pod/Digest::MD5

2 个答案:

答案 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