回答:
OpenSSLのコマンドラインユーティリティを使用している場合、バイナリ形式のダイジェストを生成でき、base64に変換することもできます(別の呼び出しで)。
echo -n foo | openssl dgst -binary -sha1 | openssl base64
openssl
base64にも使用すると、1つのツール(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
行い、それらをパイプするユーティリティを見つける必要があります。xxd
'reverse'および 'plain dump'フラグと共に使用するfschmittによる提案をとると、次のようになります。
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
基本的には、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)'
echo foo | openssl dgst -binary -sha1 | base64
これは同等であり、おそらく最もクリーンな方法です。