python - Node.js 中等效的 HMAC SHA-512 哈希函数

标签 python node.js cryptography hmac hashlib

我目前在 Python 中有这个代码片段 -

import base64
import hashlib
import hmac
def hash_hmac(self, key, data):
    res = hmac.new(base64.b64decode(key), data.encode(), hashlib.sha512).digest()
    return res

我尝试在 Node.js 中复制它,但很难获得正确的哈希值。

const crypto = require('crypto')
const hashHmac = (key, message) => {
  return crypto.createHmac('sha512', Buffer.from(key, 'base64').toString('utf-8'))
        .update(message)
        .digest()
        .toString('base64') 
}

测试用例: key :“7pgj8Dm6” 消息:'测试\0消息'

使用 python 代码片段,哈希为

69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO3mQxlsWNPrw==

使用 js 片段,哈希为

OhaJU9IibhhjIjz3R7FmodgOBUPjwhndXX8gn0r2rRzjQvCJl4T40rHXKw3o6Y2JQ5fVHTeStu8K1DRMWxMGBg==

我的base64编码有问题吗?

最佳答案

在NodeJS代码中, key 首先经过Base64解码,然后经过UTF-8解码。由于 key 包含UTF-8未定义的字节序列,因此 key 被损坏。

任意二进制数据,例如密文、散列或 key (至少是随机生成的),必须以二进制或 binary-to-text encoding 形式存储。如果要将它们转换为字符串,则必须使用 Base64(而不是像 UTF-8 这样的字符集编码),另请参阅 here .

在发布的示例中,根本不需要将缓冲区转换为字符串。 key 可以简单地作为缓冲区 s 直接传递。 crypto.createHmac() ,即如下:

var hmac = crypto.createHmac('sha512', Buffer.from(key, 'base64'));

这样,NodeJS 代码将返回与 Python 代码相同的结果。

关于python - Node.js 中等效的 HMAC SHA-512 哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68220072/

相关文章:

cryptography - 截断多项式的定义是什么?

python - 使用 praw 检测 NSFW 提交

node.js - 当我已经在 Ubuntu 上安装了 nodejs 8 时,是否可以安装 NVM?

java - 如何以编程方式生成自签名证书?

node.js - 如何在nodejs中使用sweetalert?

javascript - 带 Handlebars 的 nodemailer 无法正确显示样式

c# - 你如何确保你的熵值

python - pip使用什么端口?

Python:如何使用 matplotlib.canvas 获取鼠标点击坐标

python - 无法在docker内连接多个python socket.io