为什么更新 IntArray 时 crypto-js 输出中的更新与 NodeJS 的加密不同

Why does update in crypto-js output differ from NodeJS' crypto when updating IntArray

我正在尝试将使用 NodeJS crypto 的内容重构为使用 crypto-JS 的内容,但在更新哈希内容时我 运行 遇到了一些问题.

这是我要替换的原始哈希值:

const original_hash = crypto.createHash('sha512').update(someString).update(someIntArray).digest()

这里是使用 crypto-js 的新哈希:

const new_hash = CryptoJS.algo.SHA512.create().update(someString).update(someIntArray).finalize();

有谁知道为什么第二次更新会出现这样的差异? someIntArray 的一个例子是 Int8Array(6) [ 26, -50, -59, -118, -101, 33 ]

这是因为CryptoJS.update()不支持Int8Array作为输入,参见core.js#L561

您可以将 Int8Array 转换为十六进制字符串,并使用 CryptoJS.enc.Hex.parse() 解析它。

const int8ArrayToHex = (int8Array) => {
    // x << 24 >>> 24 converts int8 to uint8
    return Array.from(int8Array).map(x => (x << 24 >>> 24).toString(16).padStart(2, '0')).join('')
}

let hex = int8ArrayToHex(new Int8Array([ 26, -50, -59, -118, -101, 33 ]))
console.log(hex) // 1acec58a9b21

const new_hash = CryptoJS.algo.SHA512.create().update(CryptoJS.enc.Hex.parse(hex)).finalize().toString()
console.log(new_hash) // 3c1d419bfcd4...

Demo

结果可以在这里验证:CyberChef: From Decimal -> SHA512