「openssl dgst -sha1」は余分な「(stdin)=」プレフィックスと末尾の改行を生成します

「openssl dgst -sha1」は余分な「(stdin)=」プレフィックスと末尾の改行を生成します

このコマンドをUnixで実行すると

echo -n "foo" | openssl dgst -sha1

次の出力が得られます:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(その後に改行が続きます)。

(stdin)=openssl にプレフィックスを表示させず、末尾の改行を回避するにはどうすればよいでしょうか?

答え1

生のバイナリ形式では余分な出力は追加されません。
バイナリとして出力し、16 進数に変換します。

echo -n "foo" | openssl dgst -sha1 -binary | xxd -p

これをあなたに与えます:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

この方法は、誰かがテキスト出力形式を再度変更することに決めた場合でも、将来にわたって使用できるようにする必要があります。ファイル入力のプレフィックスと一致するように、プレフィックスが「SHA1(stdin)=」に修正されるはずです。

これを変更したなんて信じられません。いくつのスクリプトが壊れていたのでしょうか。

答え2

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

答え3

別の選択肢は次のとおりです。

echo -n "foo" | openssl sha1 | awk '{print $2}'

答え4

パイプ、awk、sed、tr、cut などの代わりに bash 組み込み関数を使用してこれを行う方法を次に示します。

output="$(openssl sha1 <(printf foo))"; echo ${output/* }

関連情報