因此,我尝试为我收到的附件计算 SHA1 摘要(并对其进行 base64 编码),以便它与它们的(base64 编码)摘要相匹配。使用 ChatGPT,我能够使用下面的命令来成功。但我不明白这个命令xxd -r -p
或为什么有必要。
sha1sum foo | awk '{print $1}' | xxd -r -p | base64
有两件事我不明白:
- 为什么
-p
需要该选项?我知道xxd -r
对十六进制转储进行二进制转储,但如果我不打印它,那么-p
它不会打印任何内容,而手册页说它应该打印到标准输出,而这-p
仅适用于特定的输出样式。 - 传递 SHA1 摘要的目的是什么
xxd
?我的理解xxd
本质上是在十六进制和二进制之间转换数据。但是当我在没有 的情况下运行上述命令时xxd -r -p
,它会给出不同的且不匹配的输出。我确实知道十六进制样式/表示是什么(这是 SHA1 摘要的格式),但也许我不知道“二进制”在这种情况下意味着什么?
答案1
首先,查看输入以xxd -r p
了解我们正在处理的内容。这是一个例子:
echo boo | sha1sum | awk '{print $1}'
6132b58967cf1ebc05062492c17145e5ee9f82a8
此行生成以下内容的 SHA1 哈希值四字符boo
及其尾随换行符。
现在让我们xxd
稍微研究一下该命令。xxd
(请参阅 参考资料)的手册页man xxd
解释了该xxd -r
命令反转由 生成的正常十六进制转储xxd
。所以我们可以构建这样的管道:
echo boo | xxd | xxd -r
boo
现在对比这两个输出:
echo boo | xxd
00000000: 626f 6f0a boo.
echo boo | xxd -p
626f6f0a
要将第二个输出反转为二进制,我们不仅-r
需要-p
:
echo boo | xxd -p | xxd -r -p
boo
此结构(由 生成的不带空格或其他格式的十六进制字节xxd -p
)恰好与 的输出匹配sha1sum
,这就是为什么可以使用此方法将其转换为二进制。然后(最终!)将生成的二进制文件传递给base64
,将其转换为 Base 64:
echo boo | sha1sum | awk '{print $1}' | xxd -r -p | base64
YTK1iWfPHrwFBiSSwXFF5e6fgqg=