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

如何用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脚本有几个关键错误导致结果不符:

  1. 哈希输出格式错误:你用openssl md5 -sha256生成的是十六进制哈希字符串,然后直接把这个字符串转base64——但Node.js是把哈希的二进制原始数据转base64,这俩完全不是一回事,这是结果不匹配的核心原因。
  2. 不必要的临时文件操作:写入文件再读取容易引入意外的换行符,还增加了流程复杂度。
  3. 密钥传递的潜在问题:解码后的密钥如果包含特殊字符,直接用${decodedKey}会被shell拆分,导致HMAC密钥错误。
  4. 命令使用不规范:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:15:22