gpt4 book ai didi

linux - 在应用 websocket 示例时,为什么 sha1sum 会打印出不同的结果?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:08:01 25 4
gpt4 key购买 nike

背景:我正在学习 websockets 并尝试实现一个最小的服务器。

我的问题:根据official rfc documentation字符串 "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 的 sha1 散列应该是 "b37a4f2cc0624f1690f64606cf385945b2bec4ea"。这就是sha1-online也打印出来。

但是在 bash 中按照 stackoverflow 中的建议多次使用工具 sha1sum,结果是不同的:

$ echo "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" \
| sha1sum \
| cut -d " " -f 1
05082898ab78f6da9c1ad2587b8012cd0cf52172

我尝试了什么:我认为这可能是将二进制字符串与十六进制表示混合的问题,但使用 xxd 来回转换并没有让我更接近正确的解决方案。

openssl dgst -sha1 为这个特殊的输入字符串打印完全相同的结果

我的问题是,我使用工具 sha1sum 的方式是否有任何问题或是否存在某种错误(我使用的是 GNU coreutils 8.21 版本)?

编辑:在一些测试中我宁愿使用 here-string 但这显然也添加了一个我不知道的换行符

$ sha1sum <<< "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" \
| cut -d " " -f 1
05082898ab78f6da9c1ad2587b8012cd0cf52172

最佳答案

the sha1 hash for the string "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" should be "b37a4f2cc0624f1690f64606cf385945b2bec4ea"

答案是!

问题出在您的 echo 上,它默认在字符串末尾输出换行符 (\n),如下所示,

echo "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"  | hexdump -c
0000000 d G h l I H N h b X B s Z S B u
0000010 b 2 5 j Z Q = = 2 5 8 E A F A 5
0000020 - E 9 1 4 - 4 7 D A - 9 5 C A -
0000030 C 5 A B 0 D C 8 5 B 1 1 \n
000003d

现在使用 -n 标志打印没有换行符,

echo -n "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"  | hexdump -c
0000000 d G h l I H N h b X B s Z S B u
0000010 b 2 5 j Z Q = = 2 5 8 E A F A 5
0000020 - E 9 1 4 - 4 7 D A - 9 5 C A -
0000030 C 5 A B 0 D C 8 5 B 1 1
000003c

所以对你的实际例子做同样的事情,

echo -n "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" \
| sha1sum \
| cut -d " " -f 1
b37a4f2cc0624f1690f64606cf385945b2bec4ea

来自 echo 的 man man 页面

-n do not output the trailing newline

最好使用更便携的printf(参见Why printf is better then echo),

printf "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" \
| sha1sum \
| cut -d " " -f 1
b37a4f2cc0624f1690f64606cf385945b2bec4ea

此外,您还可以摆脱任何第三方 GNU 工具,例如 cut,为此,仅内置 set 用于将输出处理为位置参数,

set -- $(printf "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11" | sha1sum)

printf "%s\n" "$1"
b37a4f2cc0624f1690f64606cf385945b2bec4ea

关于linux - 在应用 websocket 示例时,为什么 sha1sum 会打印出不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42669147/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com