【问题标题】:How to create SHA256 hash from byte array in JavaScript?如何从 JavaScript 中的字节数组创建 SHA256 哈希?
【发布时间】:2021-08-05 12:21:23
【问题描述】:

我正在尝试在 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 函数与散列字节数组兼容?

【问题讨论】:

    标签: javascript python arrays sha256 cryptojs


    【解决方案1】:

    问题不在于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
    }
    */
    

    【讨论】:

    • 谢谢!现在它使用正确的 WordArray 重现散列!
    猜你喜欢
    • 2020-06-05
    • 2011-04-20
    • 2015-12-23
    • 1970-01-01
    • 2017-01-13
    • 2015-11-22
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多