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

问题

我有使用crypto.createHash生成md5散列的node.js模块。

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

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

Node.js v0.10.0

输出: ab3af8566ddd20d7efc9b314abe90755

Node.js v6.1.0

输出: 07625e142e4ac5961de57472657a88c1

我想知道是什么原因,在新版本,我该如何解决这个问题?

更新

GitHub上的类似问题:

  • https://github.com/nodejs/node/issues/6813
  • https://github.com/node-xmpp/client/issues/206

Node v6 +中的一些input会计算与之前的Node版本不同的散列值。

基本上,当你将一个string传递给.update() ,在v6之前的版本中,默认编码是binary ,但是对于改变为utf-8节点v6。

例如,拿这个代码:

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

ab3af8566ddd20d7efc9b314abe90755在节点6上的节点6和07625e142e4ac5961de57472657a88c1上输出ab3af8566ddd20d7efc9b314abe90755

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

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

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

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

就像在github中标记这个问题一样: https : //github.com/nodejs/node/issues/6813是在v5 / v6中更改为utf8摘要的缺省编码,在v4和更早的版本中,它是binary

Interesting Posts