You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将JavaScript的HMAC函数转Python:消息参数疑问

解决JavaScript到Python的HMAC等效实现问题

首先得明确你用的JavaScript环境——如果是Node.js的crypto模块,那crypto.createHmac(algorithm, key)本身只是创建一个HMAC实例,真正生成哈希需要调用.update(data)传入消息,最后用.digest()输出结果。如果你的JS代码里没有显式调用.update(),那确实默认是用空字符串作为消息来计算HMAC的。

如果是浏览器的Web Crypto API,crypto.subtle.sign("HMAC", key, data)里的消息参数是必填的,不可能只传密钥和算法,所以大概率你用的是Node.js的API。

接下来看具体的处理方案:

1. 验证JS的默认行为

举个Node.js的示例:

const crypto = require('crypto');
const hmac = crypto.createHmac('sha256', 'my-secret-key');
console.log(hmac.digest('hex')); // 未调用update直接生成哈希

这段代码的结果和hmac.update('').digest('hex')完全一致,确实是用空字符串作为消息计算的HMAC。

2. Python的等效实现

Python的hmac模块需要明确传入消息,你只需要把空字符串作为消息参数传入即可,分两种场景处理:

场景1:JS未传入任何消息(默认空字符串)

import hmac
import hashlib

key = b'my-secret-key'  # Python的hmac要求密钥和消息都是字节类型
message = b''  # 对应JS里的空消息

# 生成HMAC哈希
hmac_result = hmac.new(key, message, hashlib.sha256).hexdigest()
print(hmac_result)

这段代码的输出和上面Node.js的示例完全一致。

场景2:JS后续调用了多次update传入消息

如果你的JS代码是这样的:

const hmac = crypto.createHmac('sha256', 'my-secret-key');
hmac.update('hello');
hmac.update('world');
console.log(hmac.digest('hex'));

那Python里可以分多次调用update,或者直接拼接消息:

import hmac
import hashlib

key = b'my-secret-key'
# 方式1:分多次update
hmac_obj = hmac.new(key, b'', hashlib.sha256)
hmac_obj.update(b'hello')
hmac_obj.update(b'world')
print(hmac_obj.hexdigest())

# 方式2:直接传入拼接后的消息
hmac_result = hmac.new(key, b'helloworld', hashlib.sha256).hexdigest()
print(hmac_result)

两种方式的输出结果完全一致。

3. 关键注意点

  • 字节类型匹配:Python的hmac模块要求密钥和消息都是bytes类型,JS里字符串默认用UTF-8编码,所以转换时要确保编码一致,比如用'字符串内容'.encode('utf-8')转换为字节。
  • 算法一致性:确保JS和Python使用完全相同的哈希算法,比如sha256、sha1等,名称不能有差异。

内容的提问来源于stack exchange,提问作者pctripsesp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:14:11