背景 我正在学习websockets并尝试实现最小的服务器。
我的问题:
根据{{3}},字符串"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
的sha1哈希值应为"b37a4f2cc0624f1690f64606cf385945b2bec4ea"
。
这也是official rfc documentation打印的内容。
但是在使用工具sha1sum的bash中,在stackoverflow中多次建议,结果是不同的:
$ 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
答案 0 :(得分:2)
字符串&#34;
dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
&#34;的sha1哈希应该是&#34;b37a4f2cc0624f1690f64606cf385945b2bec4ea
&#34;
答案是它是!
问题在于您的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
来自man
echo
页面
-n不输出尾随换行符
最好使用更便携的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