如何用Bash OpenSSL生成与Node.js等效的HMAC-SHA256 Base64哈希?
Fixing Bash OpenSSL HMAC-SHA256 to Match Node.js/C# Results
我看你在尝试用Bash+OpenSSL生成HMAC哈希时,结果和Node.js、C#的实现对不上,咱们来拆解问题并修正脚本。
首先,先明确你的Node.js核心逻辑:把base64编码的密钥解码成二进制,用这个密钥对IAmAValueToHash(无换行)做HMAC-SHA256,最后把哈希的二进制原始结果转成base64。而你的Bash脚本有几个关键错误导致结果不符:
- 哈希输出格式错误:你用
openssl md5 -sha256生成的是十六进制哈希字符串,然后直接把这个字符串转base64——但Node.js是把哈希的二进制原始数据转base64,这俩完全不是一回事,这是结果不匹配的核心原因。 - 不必要的临时文件操作:写入文件再读取容易引入意外的换行符,还增加了流程复杂度。
- 密钥传递的潜在问题:解码后的密钥如果包含特殊字符,直接用
${decodedKey}会被shell拆分,导致HMAC密钥错误。 - 命令使用不规范:用
openssl md5 -sha256虽然能勉强工作,但更正确的是用openssl dgst -sha256来处理哈希算法。
修正后的Bash脚本
#!/bin/bash valueToHash="IAmAValueToHash" key="M2VlMzRiOTFiNmM0NDY2YWI0MTAxZmZi" # 解码base64密钥为二进制,用printf避免额外换行 decodedKey=$(printf "%s" "$key" | base64 --decode) # 直接通过管道传递待哈希内容,生成二进制HMAC-SHA256后转base64 signature=$(printf "%s" "$valueToHash" | openssl dgst -sha256 -hmac "$decodedKey" -binary | openssl enc -base64) echo "$signature"
关键修正点说明:
-binary参数:让OpenSSL输出哈希的原始二进制数据,而不是默认的十六进制字符串,这确保我们和Node.js的digest('base64')逻辑完全对齐。- 管道替代临时文件:用
printf "%s" "$valueToHash"直接输出无换行的内容,通过管道传给OpenSSL,避免文件操作带来的意外干扰。 - 双引号包裹变量:
"$decodedKey"确保解码后的密钥(可能包含二进制特殊字符)被完整传递给OpenSSL,不会被shell解析拆分。 - 规范命令:用
openssl dgst -sha256替代openssl md5 -sha256,更清晰且符合OpenSSL的标准使用习惯。
运行这个脚本,你就能得到预期的结果:kzStnMJObO9gC8gtliznGcTPUeIeIs+OGrwKnUnB34I=
内容的提问来源于stack exchange,提问作者croweman
相关产品推荐
相关产品推荐

