Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务器和客户端上相同值的不同SHA1哈希_Javascript_Node.js_Unicode_Hash_Sha1 - Fatal编程技术网

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

Javascript 服务器和客户端上相同值的不同SHA1哈希,javascript,node.js,unicode,hash,sha1,Javascript,Node.js,Unicode,Hash,Sha1,在客户机上,我正在使用Rusha,我已将其放入包装器中: function cSHA1(m){ return (new Rusha).digest(m); } 在服务器上,我正在使用节点的本机加密模块 function sSHA1(m){ var h = crypto.createHash('sha1'); h.update(m); return h.digest('hex'); } 让我们试试看: cSHA1('foo') "0beec7b5ea3f0fdbc95d0dd4

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

function cSHA1(m){
  return (new Rusha).digest(m);
}
在服务器上,我正在使用节点的本机
加密
模块

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'

这让我有点悲伤;怎么回事?

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

原因很简单:一些痴迷的傻瓜决定Javascript字符串是UTF16,而PHP对编码并没有给出任何解释,它只是获取其中的内容。因此,如果向PHP提供一个json_解码(“\u00e4”),它将把它转换成一个2字节的字符串0xc3 0xa4(UTF8)

相反,JS将从中生成一个UTF16字节(0xE4)——Rusha的手册明确规定所有代码点必须低于256


为了方便您自己,请使用like
sha.digest(utf16to8(“\u00e4”)
上的UTF18-To-8库。这将为rusha提供正确的代码点。

加密功能的输入究竟是什么?他们有完整的
地图作为输入吗?非常抱歉,我肯定应该说得更清楚。。。我将通过编辑来修复它。@BastiM thereya go…:)看起来两边的散列都是正确的,但是您的输入字符串不同<代码>“:”✿ O“!=”:“?O'
所以我宁愿检查字符串的传输和两侧的编码,也不想知道散列是如何传输的differ@BastiM非常有趣。。。这是
的正确哈希。但在节点repl中,如果输入:s.charCodeAt(2),则得到:
10047
。那么SHA1函数如何获得
的值呢?