sha1sum
実際のshaの16進エンコード形式を出力します。 base64でエンコードされたバリアントが欲しいのですが。おそらく、次のように、パイプできるバイナリバージョンを出力するコマンド:echo -n "message" | <some command> | base64
または直接出力する場合も問題ありません。
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
私はあなたが何を望んでいるのか完全に理解しているわけではありませんが、次のようなものがうまくいくと思います:
$ 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
を使用する場合は、期待する出力を得るために、フォーマット設定を少し試さなければならない場合があることに注意してください。
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