Shell管道传字符串给openssl计算SHA256结果不符问题
问题根因
结果和预期不符是两处命令参数/写法错误导致的,管道传参的逻辑本身没有问题:
- 第一处:字符串输出逻辑错误。你用的
echo $body有两个隐患:一是变量未加双引号包裹,当$body包含空格、换行、通配符时会被Shell自动拆分、glob展开,篡改原始内容;二是默认echo命令会在输出内容末尾自动追加一个换行符,和你直接读取文件的原始输入内容不一致,哈希计算结果必然出现偏差。 - 第二处:openssl参数缺失。你原来计算文件哈希时给
openssl dgst加了-binary参数,会输出原始二进制格式的哈希值,后续Base64编码是针对这个二进制值做的;但你改后的字符串版本漏加了-binary参数,openssl默认输出十六进制文本格式的哈希串,后续Base64编码的对象变成了这段十六进制文本,和原逻辑的编码对象完全不同,结果自然不对。
修正方案
要完全对齐原文件哈希的计算逻辑,使用如下命令即可:
content_sha256="$(printf '%s' "$body" | openssl dgst -binary -sha256 | openssl enc -e -base64)"
这里用printf '%s'替代echo,是因为printf不会自动在输出末尾追加换行符,可以原样输出$body存储的原始内容,不会引入额外字符干扰哈希计算;同时给$body加双引号包裹,避免特殊字符被Shell解析篡改;补全-binary参数保证哈希输出格式和原逻辑一致。
内容的提问来源于stack exchange,提问作者Om Sao
相关产品推荐
相关产品推荐

