不同的SHA1哈希值用于服务器和客户端上的相同值

时间:2013-11-07 12:11:50

标签: javascript node.js unicode hash sha1

在客户端我正在使用Rusha,我已将其放入包装器中:

function cSHA1(m){
  return (new Rusha).digest(m);
}

在服务器上我使用的是Node的本机crypto模块,

function sSHA1(m){
  var h = crypto.createHash('sha1');
  h.update(m);
  return h.digest('hex');
}

我们试一试:

cSHA1('foo')
"0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"

sSHA1('foo')
'0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33'

cSHA1('bar')
"62cdb7020ff920e5aa642c3d4066950dd1f01f4d"

sSHA1('bar')
'62cdb7020ff920e5aa642c3d4066950dd1f01f4d'

到目前为止,非常好。

现在让我们给他们一个曲线球...

cSHA1(String.fromCharCode(10047))
"5bab61eb53176449e25c2c82f172b82cb13ffb9d"

sSHA1(String.fromCharCode(10047))
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'

好的,很好。

我有一个字符串,我得到它并不重要,无论如何,这是一个很长的故事,但是:

s.split('').map(function(c){
    return c.charCodeAt();
})

在两个地方产生完全相同的结果:

[58, 34, 10047, 32, 79]

现在,让我们哈希吧:

s
":"✿ O"

cSHA1(s)
"a199372c8471f35d14955d6abfae4ab12cacf4fb"

s
':"? O'
sSHA1(s)
'fc67b1e4ceb3e57e5d9f601ef4ef10c347eb62e6'

这让我有点悲痛;怎么了?

1 个答案:

答案 0 :(得分:0)

在比较PHPs sha1和Rusha的SHA1哈希时,我遇到了与德语变音字符相同的问题。

原因很简单:一些用石头傻瓜决定Javascript字符串是UTF16 - 并且PHP没有给出关于编码的sh * t,它只是采取了什么。所以,如果你给PHP一个json_decode(“\ u00e4”),它会把它变成一个2字节的字符串0xc3 0xa4(UTF8)。

JS将改为使用单个UTF16字节(0xE4) - 而Rusha的手册明确指出所有代码点必须低于256

要自助,请使用http://www.onicos.com/staff/iz/amuse/javascript/expert/utf.txt上的sha.digest(utf16to8("\u00e4"))的UTF18到8库。这将为rusha提供正确的代码点。