如何去除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
相关产品推荐
相关产品推荐

