回答:
生のバイナリ形式は、無関係な出力を追加しません。
バイナリとして出力し、16進数に変換します。
echo -n "foo" | openssl dgst -sha1 -binary | xxd -p
あなたにこれを与えます:
0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33
この方法は、誰かがテキスト出力形式を再度変更することにした場合に備えて、将来に備えて使用する必要があります。ファイルの入力と一致するように、プレフィックスを "SHA1(stdin)="に修正すると確信しています。
彼らがこれを変えたとは信じられない!いくつのスクリプトが壊れたのだろうか。
-c 256
オプションを使用して、1行あたり256オクテットに拡張します。
Ubuntu 11.10のOpenSSL 1.0.0eでこの動作を観察しますが、OpenSSL 0.9.8kおよび0.9.8tはハッシュのみを出力します。OpenSSLのコマンドラインは柔軟に設計されていません。コマンドラインから暗号計算を実行するための、より迅速で汚い方法です。
OpenSSLを使用する場合は、出力をフィルタリングします。
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'
Linux(GNUツールまたはBusyBoxを使用)では、sha1sum
OpenSSLをインストールする必要がなく、安定した出力形式のを使用できます。常にファイル名が出力されるため、削除します。
echo -n "foo" | sha1sum | sed 's/ .*//'
OSXを含むBSDシステムでは、を使用できますsha1
。
echo -n "foo" | sha1 -q
これらはすべて、16進数でチェックサムを出力し、その後に改行が続きます。UNIXシステムでのテキストは常に一連の行で構成され、各行は改行文字で終わります。コマンドの出力をシェル変数に保存すると、最後の改行は削除されます。
digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')
最終改行なしのチェックサムを必要とするプログラムに入力をパイプする必要がある場合(これは非常にまれです)、改行を取り除きます。
echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
別の代替手段を次に示します。
echo -n "foo" | openssl sha1 | awk '{print $2}'