如何在Windows上使用OpenSSL生成与Linux一致的SHA256 HMAC签名
Windows与Linux生成HMAC签名结果不一致的解决方案
问题根源
- 原生Windows cmd的
echo命令没有-n参数,默认会在输出内容末尾追加\r\n换行符,而Linux的echo -n不会输出任何尾随换行符,待签名的输入字节流不一致直接导致结果不同。 - 你之前使用的Windows命令存在逻辑错误:将
openssl dgst签名命令的参数和待签名的x-date内容混为同一个字符串输出,没有执行实际的哈希签名逻辑,仅对拼接后的长字符串做了Base64编码。
正确的Windows CMD命令写法
密钥为abc时
set /p="x-date: Wed, 13 Oct 2021 09:30:00 GMT"<nul | openssl dgst -binary -sha256 -hmac "abc" | openssl base64
这里用set /p=<nul的方式实现和Linuxecho -n完全等效的无尾随换行输出,待签名内容会通过管道正确传给openssl做哈希计算。
密钥为XciGdDmDTd5a9oArnATg3d3W1OZiJD7X时
set /p="x-date: Wed, 13 Oct 2021 09:30:00 GMT"<nul | openssl dgst -binary -sha256 -hmac "XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" | openssl base64
可选:PowerShell环境写法
如果你使用PowerShell执行,需要手动指定输入编码为ASCII,避免PowerShell默认的UTF-16编码导致输入字节流不一致:
[Text.Encoding]::ASCII.GetBytes("x-date: Wed, 13 Oct 2021 09:30:00 GMT") | openssl dgst -binary -sha256 -hmac "XciGdDmDTd5a9oArnATg3d3W1OZiJD7X" | openssl base64
内容的提问来源于stack exchange,提问作者Brad Huang
相关产品推荐
相关产品推荐

