Answers:
如果您具有OpenSSL的命令行实用程序,则它可以生成二进制形式的摘要,甚至可以转换为base64(在单独的调用中)。
echo -n foo | openssl dgst -binary -sha1 | openssl base64
openssl
对于base64而言,也具有仅依赖一个工具(ksh: base64: not found
)的优点。
sha512
,您可能希望-A
在最终openssl base64
命令中添加选项,以防止将结果字符串分成多行。
echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64
产生不同的字符串?
echo -n foo
和echo foo
产生不同的字符串。
由于sha1sum
没有为二进制输出提供选项,因此您可能需要找到一个与之相反的实用程序并将其通过od
管道传输。根据fschmitt的建议,将其xxd
与“ reverse”和“ plain dump”标志一起使用,它将看起来像这样:
sha1sum | cut -f1 -d\ | xxd -r -p | base64
xxd
:)
我不太确定我了解您的要求,但是我认为类似以下的方法应该可以工作:
$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
基本上,我将十六进制输出用于sed
,使其成为转义的十六进制值的字符串,然后用于echo -en
将字节回显到中base64
。
通过以下练习,我们可以确认最终输出对应于相同的哈希值:
$ echo -n "message" | sha1sum
6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d -
$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
b5ua881ui4pzws3O03/p9ZIm4n0=
$ echo -n "b5ua881ui4pzws3O03/p9ZIm4n0=" | base64 -d | xxd
0000000: 6f9b 9af3 cd6e 8b8a 73c2 cdce d37f e9f5 o....n..s.......
0000010: 9226 e27d .&.}
目视检查表明我们的base64值与原始十六进制匹配。请注意,如果您使用hexdump
而不是xxd
,则可能需要稍微使用格式设置才能获得所需的输出。
Perl有一个base64模块(自5.7.1开始在基本发行版中)。
echo foo | sha1sum | \
perl -MMIME::Base64 -ne '/^([[:xdigit:]]+)/ and print encode_base64(pack("H*",$1))'
如果您拥有Digest::SHA
模块(从5.9.3版本开始在基本发行版中)或较旧的Digest::SHA1
模块,则可以在perl中进行整个计算。从perl 5.10.1开始,b64digest
不填充base64输出;如果您需要填充,最简单的方法就是使用MIME::Base64
。
perl -MDigest::SHA -e 'print Digest::SHA->new(1)->addfile(*STDIN)->b64digest'
perl -MMIME::Base64 -MDigest::SHA \
-le 'print encode_base64(Digest::SHA->new(1)->addfile(*STDIN)->digest)'
echo foo | openssl dgst -binary -sha1 | base64
是等效的,并且可能是最干净的方法。