【发布时间】:2019-05-24 15:08:52
【问题描述】:
如何在 Node 的 Crypto.createHmac( 'sha256', buffer) 和 CryptoJS.HmacSHA256(..., secret) 之间实现“功能奇偶校验”?
我有一个第 3 方代码,可以执行您在此处看到的方法 node1。我需要在浏览器中实现相同的结果。看起来,区别在于secret 在节点端是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.js 中重现类似浏览器的幼稚行为。这给了我在浏览器中使用atob 来重现节点行为的想法。以下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() 并在节点中运行 browser() 会得到相同的输出。在节点中再次运行node2() 和browser() 提供相同的输出,但sign() 仍然不同于node1()。
根据上述情况,我很确定问题出在我对 atob 的使用上,但我错过了什么?
【问题讨论】:
标签: javascript node.js base64