Answers:
原始二进制格式不会添加任何多余的输出。
输出为二进制然后转换为十六进制:
echo -n "foo" | openssl dgst -sha1 -binary | xxd -p
会给你这个:
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
如果有人决定再次更改文本输出格式,则此方法应具有前瞻性。我确定他们会将前缀固定为“ SHA1(stdin)=”以与文件输入的前缀一致。
我不敢相信他们改变了这个!我想知道有多少个脚本被破坏了。
-c 256
选项将其扩展到每行256个八位位组。
我在Ubuntu 11.10的OpenSSL 1.0.0e下观察到这种行为,而OpenSSL 0.9.8k和0.9.8t仅输出哈希值。OpenSSL的命令行并非灵活设计,而是一种从命令行执行加密计算的快捷方法。
如果要使用OpenSSL,请过滤输出:
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'
在Linux(带有GNU工具或BusyBox)上,可以使用sha1sum
,它不需要安装OpenSSL,并且具有稳定的输出格式。它总是打印文件名,因此将其删除。
echo -n "foo" | sha1sum | sed 's/ .*//'
在包括OSX的BSD系统上,您可以使用sha1
。
echo -n "foo" | sha1 -q
所有这些都以十六进制输出校验和,后跟换行符。UNIX系统下的文本始终由一系列行组成,并且每行以换行符结尾。如果将命令的输出存储在shell变量中,则会删除最后的换行符。
digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')
如果您需要将输入通过管道传递到需要校验和且没有最终换行符的程序中(这确实很少),请删除换行符。
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
这是另一种选择:
echo -n "foo" | openssl sha1 | awk '{print $2}'