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

时间:2017-03-08 10:44:25

标签: linux bash

背景 我正在学习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

1 个答案:

答案 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