繁体   English   中英

如何从 JavaScript 中的字节数组创建 SHA256 hash?

[英]How to create SHA256 hash from byte array in JavaScript?

我正在尝试在 JavaScript 中重现 Python 的hashlib.sha256 但是,生成的哈希值是不同的。

在 Python hash 计算正确:

In [1]: import hashlib
   ...: from binascii import unhexlify

In [2]: a = "56687282f0f3c1ca76132c6c2fee44ee93a0b3251740719ea3e33b8366d86615"

In [3]: hashlib.sha256(unhexlify(a)).hexdigest()
Out[3]: 'd7928286f70bf6f89802d9b13bed2aae9c65609133dcd37ae03345b4ee2e8731'

使用 JavaScript 中的 CryptoJS 库:

var a = "56687282f0f3c1ca76132c6c2fee44ee93a0b3251740719ea3e33b8366d86615";
for (var bytes = [], c = 0; c < a.length; c += 2){
    bytes.push(parseInt(a.substr(c, 2), 16));
}
CryptoJS.SHA256(bytes).toString();

"4ea5c508a6566e76240543f8feb06fd457777be39549c4016436afda65d2330e"

由于 JavaScript 的bytes和 Python 的unhexlify(a)相同,因此CryptoJS.SHA256似乎产生了不同的 hash。

JavaScript 中的哪个 SHA256 函数与散列字节 arrays 兼容?

问题不CryptoJS.SHA256 ,而是在 Javascript 中将十六进制转换为字节的方式。

CryptoJS 提供了适用于您的示例的CryptoJS.enc.Hex.parse() ( doc ) 方法:

const CryptoJS = require('crypto-js');
const a = '56687282f0f3c1ca76132c6c2fee44ee93a0b3251740719ea3e33b8366d86615';
CryptoJS.SHA256(CryptoJS.enc.Hex.parse(a)).toString();
// Output: 'd7928286f70bf6f89802d9b13bed2aae9c65609133dcd37ae03345b4ee2e8731'

您的代码中的错误假设是数字数组是 hash 的有效输入。 实际上,CryptoJS 输入应该是 WordArray 类型 它们看起来像这样:

CryptoJS.enc.Hex.parse(a);
/* Output:
{
  words: [
    1449685634,
    -252460598,
    1980968044,
    804144366,
    -1818184923,
    390099358,
    -1545389181,
    1725457941
  ],
  sigBytes: 32
}
*/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM