如何从 JavaScript 中的字节数组创建 SHA256 哈希?
How to create SHA256 hash from byte array in JavaScript?
我正在尝试在 JavaScript 中复制 Python 的 hashlib.sha256
。但是,生成的哈希值不同。
在 Python 中哈希计算正确:
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
似乎产生了不同的散列。
JavaScript 中的哪个 SHA256 函数与哈希字节数组兼容?
问题不在于 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'
您的代码中的错误假设是数字数组是哈希的有效输入。
实际上,CryptoJS 输入 should be of type WordArray。他们看起来像这样:
CryptoJS.enc.Hex.parse(a);
/* Output:
{
words: [
1449685634,
-252460598,
1980968044,
804144366,
-1818184923,
390099358,
-1545389181,
1725457941
],
sigBytes: 32
}
*/
我正在尝试在 JavaScript 中复制 Python 的 hashlib.sha256
。但是,生成的哈希值不同。
在 Python 中哈希计算正确:
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
似乎产生了不同的散列。
JavaScript 中的哪个 SHA256 函数与哈希字节数组兼容?
问题不在于 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'
您的代码中的错误假设是数字数组是哈希的有效输入。 实际上,CryptoJS 输入 should be of type WordArray。他们看起来像这样:
CryptoJS.enc.Hex.parse(a);
/* Output:
{
words: [
1449685634,
-252460598,
1980968044,
804144366,
-1818184923,
390099358,
-1545389181,
1725457941
],
sigBytes: 32
}
*/