如何在Bash中将十六进制字符串当作十六进制字节计算SHA256哈希?
在Bash中将十六进制字符串当作字节数组计算SHA256哈希
问题背景
我有一段十六进制字符串:
6c64f463a38c670e5622f58ceccad23d8b9db5c9fc2a1717fc50015325b4764a
直接用sha256sum或openssl dgst -sha256计算时,得到的结果是:
52ad0981ad75e06084153fbe6d6e9363846b1cf14c9a84876d3504b957941fac
这是因为这些工具会把字符串当作ASCII文本转换为字节数组计算,但我需要将其直接解析为十六进制对应的字节数组来计算哈希,正确结果应该是:
4be5da7c50b521edb623936920044b1c546d3c38815ccc61c80b20fe171ff4cd
解决方法
在Bash里可以通过以下几种方式实现:
方法1:使用xxd + sha256sum
xxd工具可以将十六进制字符串转换为原始字节流,再传递给sha256sum计算:
echo -n "6c64f463a38c670e5622f58ceccad23d8b9db5c9fc2a1717fc50015325b4764a" | xxd -r -p | sha256sum
-n:避免echo自动添加换行符,防止干扰哈希计算结果xxd -r -p:-r表示反向转换(十六进制转原始字节),-p表示使用纯十六进制格式(忽略行号等额外信息)
方法2:使用openssl直接处理
openssl支持结合解码工具处理十六进制字符串,再计算哈希:
echo -n "6c64f463a38c670e5622f58ceccad23d8b9db5c9fc2a1717fc50015325b4764a" | xxd -r -p | openssl dgst -sha256
也可以直接用openssl的编码模块解码:
echo -n "6c64f463a38c670e5622f58ceccad23d8b9db5c9fc2a1717fc50015325b4764a" | openssl enc -d -hex | openssl dgst -sha256
openssl enc -d -hex:直接解码十六进制字符串为原始字节流
方法3:使用printf(适合较短字符串)
利用printf的格式识别能力,把十六进制字符串转为字节:
printf "$(echo "6c64f463a38c670e5622f58ceccad23d8b9db5c9fc2a1717fc50015325b4764a" | sed 's/../\\x&/g')" | sha256sum
sed 's/../\\x&/g':把每两个十六进制字符替换为\xXX格式,让printf识别为对应字节
验证结果
以上方法执行后,都会得到预期的正确哈希值:
4be5da7c50b521edb623936920044b1c546d3c38815ccc61c80b20fe171ff4cd
内容的提问来源于stack exchange,提问作者k1r1t0
相关产品推荐
相关产品推荐

