如何在 Node 的 Crypto.createHmac( 'sha256', buffer)
和 CryptoJS.HmacSHA256(..., Secret)
之间实现“功能奇偶校验”?
我有一个第 3 方代码,它执行您在此处看到的方法 node1
的操作。我需要在浏览器中获得相同的结果。表面上看,区别在于 secret
在 Node 端进行了 base64 解码。但我仍然无法得到相同的输出。
const CryptoJS = require('crypto-js')
const Crypto = require('crypto')
const message = "Message"
const secret = "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw=="
function node1() {
return Crypto.createHmac("sha256", Buffer.from(secret, 'base64'))
.update(message, "utf8")
.digest("base64");
}
function node2() {
return Crypto.createHmac("sha256", Buffer.from(secret, 'base64').toString('base64'))
.update(message, "utf8")
.digest("base64");
}
function browser() {
const crypted = CryptoJS.HmacSHA256(message, secret)
return CryptoJS.enc.Base64.stringify(crypted)
}
console.log('node1', node1())
console.log('node2', node2())
console.log('browser-like', browser())
// node1 agitai8frSJpJuXwd4HMJC/t2tluUJPMZy8CeYsEHTE=
// node2 fxJQFWs5W3A4otaAlnlV0kh4yfQPb4Y1ChSVZsUAAXA=
// browser-like fxJQFWs5W3A4otaAlnlV0kh4yfQPb4Y1ChSVZsUAAXA=
因此,我可以在 Node 中重现类似浏览器的简单行为。这给了我在浏览器中使用atob来重现 Node 行为的想法。以下 sign
方法是我在浏览器端的最佳猜测。
function sign(message) {
const crypted = CryptoJS.HmacSHA256(message, atob(secret));
return CryptoJS.enc.Base64.stringify(crypted)
}
function signNotDecoded(message) {
const crypted = CryptoJS.HmacSHA256(message, secret);
return CryptoJS.enc.Base64.stringify(crypted)
}
console.log('browser', sign('Message'))
console.log('browser-like', signNotDecoded('Message'))
// browser dnVm5jBgIBNV6pFd4J9BJTjx3BFsm7K32SCcEQX7RHA=
// browser-like fxJQFWs5W3A4otaAlnlV0kh4yfQPb4Y1ChSVZsUAAXA=
因此,在浏览器中运行 signDecoded()
和在 Node 中运行 browser()
会给出相同的输出。再次在 Node 中运行 node2()
和 browser()
提供相同的输出,但 sign()
仍然与 node1( )
。
根据上述内容,我很确定问题出在我对 atob 的使用上,但是我错过了什么?
最佳答案
改变
atob(secret)
至
CryptoJS.enc.Base64.parse(secret)
因为如果您将原始字符串作为键传递给函数,它将被重新解析为 UTF-8。
关于javascript - 如何在浏览器中复制 Node 的 Crypto.createHmac( 'sha256' , buffer) ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56295298/