来自CryptoJS和Python Hashlib的等效MD5

时间:2018-09-24 18:42:29

标签: javascript python node.js python-3.x hashlib

我尝试将一些代码从JS带到Python。 我陷入了JS中的代码:

const crypto = require('crypto')

var txtToHash = "Hello¤World¤";
var md5sum = crypto.createHash('md5');
md5sum.update(new Buffer(txtToHash, 'binary'));
md5val = md5sum.digest('hex');
// equivalent to
// crypto.createHash('md5').update(urlPart, 'binary').digest('hex'));

返回: 3a091f847ee21c7c1927c19e0f29a28b

而且,在Python 3.7中,我有以下代码:

import hashlib

txtToHash = "Hello¤World¤"
md5val = hashlib.md5(txtToHash.encode()).hexdigest() 

返回值:f0aef2e2e25ddf71473aa148b191dd70

为什么它们不同?我在Google或SO上找不到答案。

1 个答案:

答案 0 :(得分:2)

您在摘要创建期间使用了两种不同的字符编码。

请确保您使用相同类型的字符编码。您的节点js实现使用的是“二进制”别名“ latin1”编码。 python中的代码使用UTf8字符编码。

当您指定txtToHash.encode()时,这意味着将文本编码为utf-8。

因此,请修改摘要的创建,以在两种环境中匹配编码相同的字符。

要么修改您的nodejs代码

md5sum.update(new Buffer(txtToHash, 'utf8'));

或将python代码修改为

md5val = hashlib.md5(txtToHash.encode('latin1')).hexdigest()

上面应该给出相同的结果>> 3a091f847ee21c7c1927c19e0f29a28b

注意: 尽管python代码给出了预期的结果。我不建议这样做,因为与utf8相比,latin1编码仅包含一小部分字符。因此,我建议您在节点js应用中将编码更改为utf-8,并在python中也应用相同的编码