微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 node.js 中等效的 HMAC SHA-512 哈希函数

如何解决在 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' 消息:'测试\0消息'

使用 python 代码段,哈希值是

69H45OZkKcmR9LOszbajUUPGkGT8IqasGPAWqW/1stGC2Mex2qhIB6aDbuoy7eGfMsaZiU8Y0lO3mQxlsWNPrw==

使用 js 代码段,哈希值是

OhaJU9IibhhjIjz3R7FmodgOBUPjwhndXX8gn0r2rRzjQvCJl4T40rHXKw3o6Y2JQ5fVHTeStu8K1DRMWxMGBg==

我的 base64 编码有问题吗?

解决方法

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

任意二进制数据,例如密文、散列或密钥(至少如果是随机生成的),必须以二进制存储,或者必须使用 binary-to-text encoding 之类的 Base64(而不是字符集编码,例如 UTF -8) 如果要将它们转换为字符串,另见 here

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。