-1

我从这个奇怪的场景开始,之后有人指出我实际上得到了正确的哈希值,但是输入字符串的编码在某种程度上是错误的。

所以我挖得更深。我的 Node.js VM 中有这个字符串s。回复:

> s
':"? O'
> s.charAt(2)
'?'
> s.charCodeAt(2)
10047
> var c = s.charAt(2)
> c.charCodeAt()
10047

仅凭这一点,我就认为字符串本身没有问题,只是我的终端无法显示它(Windows XP 上的 cmd.exe)。

但是,看看我的 SHA1 函数以及当我尝试应用它时会发生什么:

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

> SHA1(c)
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'

有趣的是,即使我从代码点手动构建它,它仍然会搞砸:

> SHA1(String.fromCharCode(10047)
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'

> SHA1(String.fromCharCode(63))
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'

This seems to happen in Chrome with Rusha, as well.

这里发生了什么?

4

1 回答 1

0

做更新时 Buffer 是默认类型。所以当给出一个字符串时,你必须明确地传递它。

>  var h = crypto.createHash('sha1');
>  h.update(String.fromCharCode(10047),'utf8').digest('hex');
'902c43163c965fb0cf4c276f9b660c97a22fb355'
>  var h = crypto.createHash('sha1');
>  h.update(String.fromCharCode(63),'utf8').digest('hex');
'5bab61eb53176449e25c2c82f172b82cb13ffb9d'
于 2013-11-07T13:49:17.657 回答