【问题标题】:How to replicate Node's Crypto.createHmac( 'sha256', buffer) in the browser?如何在浏览器中复制 Node 的 Crypto.createHmac('sha256', buffer)?
【发布时间】: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


    【解决方案1】:

    改变

    atob(secret)
    

    CryptoJS.enc.Base64.parse(secret)
    

    因为如果您将原始字符串作为键传递给函数,它将被重新解析为 UTF-8。

    【讨论】:

      猜你喜欢
      • 2012-08-14
      • 2012-02-21
      • 2012-10-06
      • 1970-01-01
      • 2012-06-21
      • 2012-12-08
      • 1970-01-01
      • 2017-07-04
      • 1970-01-01
      相关资源
      最近更新 更多