【问题标题】:Differing SHA1 hashes for identical values on the server and the client服务器和客户端上相同值的不同 SHA1 哈希
【发布时间】:2013-11-19 01:53:34
【问题描述】:

在我使用 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'

这让我很伤心;什么鬼?

【问题讨论】:

  • 加密函数的输入到底是什么?他们得到完整的map 作为输入吗?
  • 非常抱歉,我绝对应该更清楚地说明这一点......我会通过编辑来解决它。
  • @BastiM thereya go... :)
  • 看起来两边的哈希值都是正确的,但是你的输入字符串不同! ":"✿ O" != ':"? O' 所以我宁愿检查你的字符串的传输和双方的编码,而不是想知道哈希有什么不同
  • @BastiM 非常有趣... ? 的正确哈希值。但是在节点 repl 中,如果我输入:s.charCodeAt(2),我会得到:10047。那么 SHA1 函数如何获取? 的值呢?

标签: javascript node.js unicode hash sha1


【解决方案1】:

在比较 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 提供正确的代码点。

【讨论】:

    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2015-06-25
    相关资源
    最近更新 更多