web-dev-qa-db-ja.com

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

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

33
xenoterracide

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

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

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

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

16
alex

私はあなたが何を望んでいるのか完全に理解しているわけではありませんが、次のようなものがうまくいくと思います:

$ 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
Steven D

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

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

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

または:

$ cksum -q -a sha256b $FILE
0
mykhal