通过Linux命令行生成SHA-256哈希值

354
我知道字符串 "foobar" 生成的 SHA-256 哈希值为 c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2,可以通过http://hash.online-convert.com/sha256-generator 来生成。但是在命令行 shell 中:
hendry@x201 ~$ echo foobar | sha256sum
aec070645fe53ee3b3763059376134f058cc337247c978add178b6ccdfb0019f  -

生成了一个不同的哈希值。我错过了什么?


6
sha256sum < foobar SHA256校验和 < foobar - koppor
14
@koppor < foobarecho foobar | 不是同一回事。相当于 echo foobar | 的命令是 sha256sum <<< foobar,但这会像 echo 一样在 foobar 后添加一个新行符。 - mvds
1
无法工作,它声称foobar:没有这个文件或目录 - kap
sha256sum < foobarecho foobar | sha256sum并不是完全相同的事情。前者是将文件"foobar"的内容作为标准输入提供给sha256sum进程。而后者是将echo内置命令提供的输入传递给sha256sum,输入是作为命令行参数传递给echo的字符串"foobar"。 - undefined
8个回答

543

echo通常会输出一个换行符,可以使用-n来抑制它。尝试运行以下命令:

echo -n "Hello World!"

echo -n foobar | sha256sum

107
注意:在 OS X(BSD)上,使用命令 echo -n foobar | shasum -a 256 - Olie
13
在OSX上,创建一个别名可能会很方便:alias sha256sum='shasum --algorithm 256'。该别名可以让您更轻松地使用指定的命令行工具,并将其简化为更易记和更易键入的名称。 - Jonathan Cross
4
为什么它以 *- 结尾? - Philip Rego
6
这句话的意思是:“这是在stdin输入的数据的shasum(校验和),因此打印出来的不是文件名,而是“ - ”。” - mvds
2
为了仅显示哈希值而不是 - 或 *,请将以下内容添加到所示命令中 | cut -d " " -f1 - nassim
显示剩余4条评论

129
如果您已经安装了 openssl,您可以使用以下命令:
echo -n "foobar" | openssl dgst -sha256

对于其他算法,您可以将-sha256替换为-md4-md5-ripemd160-sha-sha1-sha224-sha384-sha512-whirlpool


有没有一种方法可以指定你想要在sha512中进行的轮数?我搜索了一下,但没有找到相关信息,想知道您是否了解? - f1lt3r
2
@AlistairMacDonald - 我不确定你正在寻找什么。据我所知,SHA512需要80轮;如果你想操纵这个函数,它就不再是sha512了。顺便说一句,你可以在crypto.stackexchange.com上搜索/提问你的问题。 - Farahmand

54
如果命令sha256sum不可用(例如在Mac OS X v10.9(Mavericks)上),您可以使用以下命令:
echo -n "foobar" | shasum -a 256

2
不错!我已将此添加到我的 .bash_profile 文件中 函数 sha256() { echo -n "$*" | shasum -a 256 } 并像这样调用:~$ sha256 foobar - rbento
2
你是不是指的 Ubuntu 10.10 (Maverick Meerkat)?(注意没有's',Maverick)。它于2010年发布,而Mac OS X v10.9则在此回答发布前一个月发布。 - Peter Mortensen

37

echo -n 命令由于历史悠久,因此不太可能消失。然而根据最近的POSIX标准,新的符合标准的应用程序“鼓励使用printf”。


17

要在base64中使用sha256哈希,请使用:

echo -n foo | openssl dgst -binary -sha256 | openssl base64

例子

echo -n foo | openssl dgst -binary -sha256 | openssl base64
C+7Hteo/D9vJXQ3UfzxbwnXaijM=

2
我很高兴我向下滚动了 - 一直在尝试通过组合 shasumbase64 来获取 base64 哈希值,但一直得到错误的结果。关键是传递给 openssl-binary 参数,感谢您的发布! - Paul
在将输出管道传输到另一种类型之前,请确保过滤输出。在Linux中,我们得到stdin=,有些末尾会加上“-”。始终使用 | cut -d " " -f2 去掉这个部分。根据您想要裁剪的位置,您可能需要使用-f1。 - nassim
1
我已经折腾了几个小时了,谢谢你的openssl技巧!+1! - undefined

14

使用printf而不是echo可以避免添加额外的换行符。

printf foobar | sha256sum

对于任意字符串,应使用%s格式说明符。

printf '%s' 'somestring' | sha256sum

2
请勿混淆print和printf,print仍会添加一个新行。 - Angelo Dureghello
6
如果你不完全知道“foobar”的值,应该这样写:printf '%s' "foobar" | sha256sum。因为printf需要一个格式字符串。至于print,据我所知,它只是zsh中类似于echo的命令,并且可以使用-n选项。 - Phil P
@PhilP 很好的观点。我已经更新了答案。 - Unmitigated

13

echo命令会生成一个结尾的换行符,这个换行符也会被哈希。可以试试这种写法:

/bin/echo -n foobar | sha256sum 

9

我认为echo输出时会自动添加一个换行符。尝试使用-n参数来跳过换行符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接