将python哈希摘要移植到节点js

时间:2016-07-31 13:52:39

标签: python node.js sha1

我正在尝试将Python脚本移植到Node,并且我已经陷入SHA1哈希。

以下Python代码:

import hashlib

user = 'test'

ret = hashlib.sha1(user.encode('utf-8')).digest()
print(ret);

打印出来:

b'\xa9J\x8f\xe5\xcc\xb1\x9b\xa6\x1cL\x08s\xd3\x91\xe9\x87\x98/\xbb\xd3'

我在Node中需要这种格式的SHA1哈希。这个Javascript:

var crypto = require('crypto');

var generator = crypto.createHash('sha1');
generator.update(new Buffer('test'));
console.log(generator.digest('binary'));

打印

©Jå̱sÓé/»Ó

如何让Node以与Python相同的方式生成输出?它显然不是二进制或十六进制,python输出的格式是什么?

1 个答案:

答案 0 :(得分:2)

两个结果已经相同。字节的字符串表示(你在控制台上看到的东西)虽然在JavaScript和Python上有所不同。要证明它们是相同的,请将它们转换为整数列表:

> var crypto = require('crypto');
> var generator = crypto.createHash('sha1');
> generator.update(new Buffer('test'));
> var digest = generator.digest('binary');
> var lst = [];
> for (let i = 0;i < digest.length;i++) st.push(digest.charCodeAt(i));
> console.log(JSON.stringify(lst));
[169,74,143,229,204,177,155,166,28,76,8,115,211,145,233,135,152,47,187,211]

python中的结果相同:

>>> import hashlib, base64
>>> ret = hashlib.sha1('test'.encode('utf-8')).digest()
>>> print(list(ret))
[169, 74, 143, 229, 204, 177, 155, 166, 28, 76, 8, 115, 211, 145, 233, 135, 152, 47, 187, 211]

您可以使用hexdigest / digest('hex')获取十六进制字符串('a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'),这可能更容易处理。

但字节没有错;再一次,它只是字符串表示不同。例如,如果将两个字节都写入文件,则两个文件将完全相同。