首页 > 解决方案 > 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 编码有问题吗?

标签: pythonnode.jscryptographyhmachashlib

解决方案


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

任意二进制数据,例如密文、散列或密钥(至少在随机生成的情况下)必须以二进制形式存储,或者必须使用像 Base64 这样的二进制到文本编码(而不是像 UTF-8 这样的字符集编码) 如果要将它们转换为字符串,请参见此处

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

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

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


推荐阅读