0

在客户端上,我使用的是 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'

这让我有点悲痛。搞什么鬼?

4

1 回答 1

0

在比较 PHP 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上的 UTF18-to-8 库,例如sha.digest(utf16to8("\u00e4")). 这将为 rusha 提供正确的代码点。

于 2014-01-24T19:40:03.363 回答