Python与OpenSSL的HMAC SHA256摘要结果不一致问题排查
HMAC SHA256签名:Python与Windows OpenSSL命令输出不一致的解决办法
问题场景
需要用Python基于HMAC SHA256算法,通过私钥和消息生成签名,但不管怎么调整,Python代码生成的结果和Windows命令行里用OpenSSL生成的始终对不上。哪怕用最简单的字符串(比如333)同时当密钥和消息测试,结果还是存在差异。试过调整编码格式、切换字符串类型等各种办法,都没解决问题。
排查原因
折腾半天发现,问题根本不在Python代码或者OpenSSL本身,而是Windows系统的echo命令不支持Linux下的-n参数。之前用的OpenSSL命令大概是这样的:
echo -n "333" | openssl dgst -sha256 -hmac "333"
Windows里的echo会直接忽略-n参数,还会自动在输出末尾加一个换行符,相当于实际传给OpenSSL的消息是333\n,而Python代码里是直接用纯字符串"333"计算签名,两者的输入消息不一样,结果自然无法匹配。
解决方法
把echo命令换成带/p=参数的写法,这个参数会让echo输出指定内容但不添加换行符。正确的OpenSSL命令如下:
echo /p="333" | openssl dgst -sha256 -hmac "333"
对应的Python参考代码(用标准库即可实现,无需依赖pyopenssl):
import hmac import hashlib key = b"333" message = b"333" signature = hmac.new(key, message, hashlib.sha256).hexdigest() print(signature)
现在再分别运行两边的命令,生成的签名就能完全一致了。
环境信息
- Windows 10
- OpenSSL 3.2.1
- Python 3.10
- pyopenssl 24.0.0
内容的提问来源于stack exchange,提问作者Lautaro Scoflich
相关产品推荐
相关产品推荐

