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

时间:2016-05-13 14:52:54

标签: javascript node.js hash backwards-compatibility node-crypto

问题

我有使用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 个答案:

答案 0 :(得分:23)

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

基本上,当您将字符串传递给.update()时,使用v6之前的节点版本,默认编码为binary,但对于已更改为utf-8的节点v6。

例如,请使用以下代码:

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

这将在节点6之前的节点6和节点6上的ab3af8566ddd20d7efc9b314abe90755输出07625e142e4ac5961de57472657a88c1

如果您希望节点6输出与前6版相同的内容,则必须告诉.update()使用binary编码:

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

或者相反(使节点6之前的输出与6相同):

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

答案 1 :(得分:3)

就像在github中标记这个问题一样: https://github.com/nodejs/node/issues/6813是关于摘要的默认编码,该摘要在v5 / v6和v4中更改为utf8,之前更改为binary