python - node.js 中等效的 HMAC SHA-512 散列函数
问题描述
我目前在 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')
}
测试用例:键:'7pgj8Dm6' 消息:'Test\0Message'
使用 python 片段,哈希是
69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO3mQxlsWNPrw==
使用 js 片段,哈希是
OhaJU9IibhhjIjz3R7FmodgOBUPjwhndXX8gn0r2rRzjQvCJl4T40rHXKw3o6Y2JQ5fVHTeStu8K1DRMWxMGBg==
我的 base64 编码有问题吗?
解决方案
在 NodeJS 代码中,密钥首先是 Base64 解码,然后是 UTF-8 解码。由于密钥包含未由 UTF-8 定义的字节序列,因此会被损坏。
任意二进制数据,例如密文、散列或密钥(至少在随机生成的情况下)必须以二进制形式存储,或者必须使用像 Base64 这样的二进制到文本编码(而不是像 UTF-8 这样的字符集编码) 如果要将它们转换为字符串,请参见此处。
在发布的示例中,根本不需要将缓冲区转换为字符串。密钥可以简单地直接作为缓冲区传递,s。crypto.createHmac()
,即如下:
var hmac = crypto.createHmac('sha512', Buffer.from(key, 'base64'));
这样,NodeJS 代码返回与 Python 代码相同的结果。
推荐阅读
- ios - Xamarin iOS 和 iOS 14 UISplitViewController 三列
- reactjs - 增量静态再生中的重新验证过程如何工作?
- python-3.x - 通过移动所有应用程序模型,将Django项目转换为MVC(模型,视图,控制)结构,查看不同文件夹中的文件
- javascript - 使用字段名称的 indexedDB 读取游标
- amazon-s3 - 在现有 S3 存储桶上部署时没有触发 Lambda
- string - 我正在制作一个相反的字母加密东西
- java - 添加 getter 后 JButtons 行为怪异
- html - 如何为 Wordpress 格式化带有 Long FormText 的项目符号列表
- java - 如何在 OpenJPA 中注释和持久化地图?
- android - 无法为 org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler 类型的对象获取未知属性“android”