首页 > 解决方案 > 为什么在更新 IntArray 时,crypto-js 输出中的更新与 NodeJS 的 crypto 不同

问题描述

我正在尝试将使用 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();

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

标签: javascriptcryptographycryptojs

解决方案


这是因为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...

演示

结果可以在这里验证:Cyber​​Chef:从十进制 -> SHA512


推荐阅读