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

如何去除Shell中openssl签名结果的'(stdin)= '前缀?

问题:提取OpenSSL HMAC签名中的纯哈希值

我用以下Shell脚本生成HMAC-SHA256签名:

#!/usr/bin/env bash

api_params_with_timestamp="somethingXXXX"
SECRET_KEY="XXXXXXXXXXXXXX"
signature=$(echo -n "$api_params_with_timestamp" \
        | openssl dgst -sha256 -hmac "$SECRET_KEY")
echo "signature"=$signature

执行后输出是:signature=(stdin)= 3eee8d204c83381dddffgggg,我只需要其中的签名值3eee8d204c83381dddffgggg,之前用cut -c10-1000实现了效果,但这个方法不够完美,有没有更健壮的方式去掉(stdin)= 部分?


解决方案

方法1:用awk提取最后一个字段

因为openssl的输出格式固定为(stdin)= 哈希值,直接用awk取最后一段内容即可,不管前缀长度如何变化都能稳定拿到哈希值:

#!/usr/bin/env bash

api_params_with_timestamp="somethingXXXX"
SECRET_KEY="XXXXXXXXXXXXXX"
signature=$(echo -n "$api_params_with_timestamp" \
        | openssl dgst -sha256 -hmac "$SECRET_KEY" | awk '{print $NF}')
echo "signature=$signature"

方法2:用sed替换前缀

通过sed匹配并删除从开头到= 的所有内容,只保留后面的哈希值:

#!/usr/bin/env bash

api_params_with_timestamp="somethingXXXX"
SECRET_KEY="XXXXXXXXXXXXXX"
signature=$(echo -n "$api_params_with_timestamp" \
        | openssl dgst -sha256 -hmac "$SECRET_KEY" | sed 's/^.*= //')
echo "signature=$signature"

方法3:直接生成纯十六进制哈希(推荐)

利用openssl的-binary参数输出二进制哈希,再通过xxd -p转成纯十六进制字符串,彻底避免输出前缀的问题,兼容性和可靠性更强:

#!/usr/bin/env bash

api_params_with_timestamp="somethingXXXX"
SECRET_KEY="XXXXXXXXXXXXXX"
signature=$(echo -n "$api_params_with_timestamp" \
        | openssl dgst -sha256 -hmac "$SECRET_KEY" -binary | xxd -p)
echo "signature=$signature"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 19:55:15