在客户端我正在使用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'
这让我有点悲痛;怎么了?
答案 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提供正确的代码点。