CLIでbase64エンコードされたshaXを取得するにはどうすればよいですか?


32

sha1sum実際のshaの16進エンコード形式を出力します。base64でエンコードされたバリアントが見たいです。おそらく、パイプできるバイナリバージョンを出力するコマンドのように:echo -n "message" | <some command> | base64または、直接出力する場合でも問題ありません。

回答:


41

OpenSSLのコマンドラインユーティリティを使用している場合、バイナリ形式のダイジェストを生成でき、base64に変換することもできます(別の呼び出しで)。

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

1
echo foo | openssl dgst -binary -sha1 | base64これは同等であり、おそらく最もクリーンな方法です。
xenoterracide

3
opensslbase64にも使用すると、1つのツール(ksh: base64: not found)のみに依存するという利点があります。
ジル「SO-悪であるのをやめる」

2
のような大きなメッセージダイジェストハッシュの場合、最終的なコマンドにオプションをsha512追加して、結果の文字列が複数行に分割されないようにすることができ-Aますopenssl base64
mykhal

@Gillesなぜecho foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64異なる文字列が生成されるのですか?
ジョージアリートソス

@gliatsos 異なる文字列echo -n fooecho foo生成するため。
ジル「SO-悪であるのをやめる」

16

sha1sumバイナリ出力のオプションが提供されていないので、逆の処理をod行い、それらをパイプするユーティリティを見つける必要があります。xxd'reverse'および 'plain dump'フラグと共に使用するfschmittによる提案をとると、次のようになります。

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


4
-rpフラグとともにxxdを使用します。このように:sha1sum somefile.txt | カット-f1 -d \ | xxd -r -p | base64
fschmitt

@fschmitt:回答を投稿する前にこのコメントを読んでおくべきでしたが、はるかにきれいです。回答として投稿することを検討してください。私はそれに投票します。
スティーブンD

それはもっとアレックスの答えです、私は「16進バイナリユニックスの変換」をグーグルで検索したので、アレックス、あなたの答えを自由に編集してxxdコールを含めてください、私たちはこれを投票します。
fschmitt

私の答えを編集しました。指摘xxdしてくれてありがとう:)
アレックス

驚くばかり!これは、このステップの必要性について言及していないドキュメント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

基本的には、16 進出力sedを取得し、それをエスケープされた16進値の文字列にして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値が元の16進数と一致することがわかります。使用するの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

Base64でエンコードされたSHA256ハッシュは、最近OpenBSDの標準的なファイルチェックサムになりました。OpenBSD -bsha256(またはsha1、sha512)コマンドにオプションを追加するだけで実行できます。

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

または:

$ cksum -q -a sha256b $FILE
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.