javascript - 如何在浏览器中复制 Node 的 Crypto.createHmac( 'sha256' , buffer) ?

标签 javascript node.js base64

如何在 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/

相关文章:

javascript - <图片> src(事件源)

r - 如何在 R 中显示 base64 图像

c# - Convert.FromBase64String 在代码中不起作用,但在在线工具中起作用

javascript - JQuery - 在没有事件的情况下操作新元素

javascript - .对话框未显示在表格单元格上单击

node.js - 如何在产品环境中保护我的 GO REST 服务?

javascript - Protractor :如何确认调用了 fs.watch

node.js - Openshift Layer4 连接,应用程序无法启动

c# - 在 MVC c# 中将 base64 转换为可下载的 zip 文件

javascript - meteor 自动将地理位置保存到用户文档中