为什么crypto.createHash在新版本中返回不同的结果?

14

问题

我有一个使用crypto.createHash生成md5哈希的 node.js 模块。

最近我注意到,crypto模块生成的哈希在新版本中是不同的:

代码

require('crypto').createHash('md5').update('¥').digest('hex')

Node.js v0.10.0

输出:ab3af8566ddd20d7efc9b314abe90755

Node.js v6.1.0

输出:07625e142e4ac5961de57472657a88c1

问题

我想知道新版本中是什么原因引起的,以及如何解决?

更新

Github 上类似的问题:

2个回答

27

在 Node v6+ 中,某些输入计算出的哈希值与之前 Node 版本不同。

基本上,当你将一个字符串传递给 .update() 时,在 Node v6 之前的默认编码是 binary,但是在 Node v6 中,它已经改为了 utf-8

例如,看看这段代码:

require('crypto').createHash('md5').update('¥').digest('hex')

在 Node pre-6 上,这将输出 ab3af8566ddd20d7efc9b314abe90755,在 Node 6 上则输出 07625e142e4ac5961de57472657a88c1

如果您希望 Node 6 输出与 pre-6 版本相同的结果,则需要告诉 .update() 使用 binary 编码:

require('crypto').createHash('md5').update('¥', 'binary').digest('hex')

或者反过来(使 Node pre-6 的输出与 6 相同):

require('crypto').createHash('md5').update('¥', 'utf-8').digest('hex')

这些编码(二进制/UTF-8)是否因字符字节顺序而异? - vp_arth
1
@vp_arth,它们不是字节顺序的问题,而是它们在字节中的表示方式不同。我相信binary是Latin-1编码(它在可以表示的字符数量上有限制,这可能是Node v6默认更改为utf-8的原因)。 - robertklep

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接