如何在cli上获取base64编码的shaX?


31

sha1sum输出实际阴影的十六进制编码格式。我想看一下base64编码的变体。可能有一些命令输出我可以通过管道echo -n "message" | <some command> | base64传输的二进制版本,例如:或者直接输出它也可以。

Answers:


40

如果您具有OpenSSL的命令行实用程序,则它可以生成二进制形式的摘要,甚至可以转换为base64(在单独的调用中)。

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

1
echo foo | openssl dgst -binary -sha1 | base64是等效的,并且可能是最干净的方法。
xenoterracide 2010年

3
同样,openssl对于base64而言,也具有仅依赖一个工具(ksh: base64: not found)的优点。
吉尔(Gilles)“所以

2
对于像这样的大消息摘要散列sha512,您可能希望-A在最终openssl base64命令中添加选项,以防止将结果字符串分成多行。
mykhal 2015年

@Gilles为什么echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64产生不同的字符串?
georgeliatsos

@gliatsos因为echo -n fooecho foo产生不同的字符串。
吉尔斯(Gilles)'所以

15

由于sha1sum没有为二进制输出提供选项,因此您可能需要找到一个与之相反的实用程序并将其通过od管道传输。根据fschmitt的建议,将其xxd与“ reverse”和“ plain dump”标志一起使用,它将看起来像这样:

sha1sum | cut -f1 -d\ | xxd -r -p | base64


4
将xxd与-rp标志一起使用。像这样:sha1sum somefile.txt | 切-f1 -d \ | xxd -r -p | base64
fschmitt 2010年

@fschmitt:在发布答案之前,我应该已经阅读了此评论,它要干净得多。您应该考虑将其发布为答案。我会投票赞成。
史蒂文D

它是alex的答案,我只是在Google上搜索了“转换十六进制的二进制unix”,所以alex,可以随时编辑您的答案以包括xxd调用,我们将对此进行投票。
fschmitt 2010年

编辑了我的答案。感谢您指出xxd:)
Alex

太棒了!这是很难从文档找出httpd.apache.org/docs/2.4/misc/password_encryptions.html其中不提这一步的必要性
phil294

1

我不太确定我了解您的要求,但是我认为类似以下的方法应该可以工作:

$ 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,则可能需要稍微使用格式设置才能获得所需的输出。


1

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)'

如果我们使用的是perl,则可以使用Digest :: SHA模块,该模块将允许我们直接输出到base64。
xenoterracide

0

最近,在OpenBSD中, Base64编码的SHA256哈希成为相当标准的文件校验和。只需-b在OpenBSD的sha256(或sha1,sha512)命令中添加选项即可完成此操作:

$ FILE=/dev/null
$ sha256 -q -b $FILE
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

要么:

$ cksum -q -a sha256b $FILE
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.