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


31

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

echo -n "foo" | openssl dgst -sha1

次の出力が得られます。

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

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

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


@MarkDavidsonうーん、面白い。改行を追加しなくてもよろしいですか?

回答:


22

生のバイナリ形式は、無関係な出力を追加しません。
バイナリとして出力し、16進数に変換します。

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

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

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

この方法は、誰かがテキスト出力形式を再度変更することにした場合に備えて、将来に備えて使用する必要があります。ファイルの入力と一致するように、プレフィックスを "SHA1(stdin)="に修正すると確信しています。

彼らがこれを変えたとは信じられない!いくつのスクリプトが壊れたのだろうか。


4
1行あたり20〜30オクテット(または40〜60文字)のみを出力します。SHA-256チェックサムの場合、これでは十分でない場合があります。-c 256オプションを使用して、1行あたり256オクテットに拡張します。
Rockallite

16

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を使用)では、sha1sumOpenSSLをインストールする必要がなく、安定した出力形式のを使用できます。常にファイル名が出力されるため、削除します。

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

これは完璧な状況です=>ソリューションマップをコピーして貼り付けます。ありがとう!
oberstet

6

別の代替手段を次に示します。

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

1
この特定の形式で質問が尋ねられることは知っていますが、誰かがこれをファイル名を含めるように拡張しようとすると、ファイル名にスペースが含まれていると壊れる可能性があります。ここに着陸する他の人々に向かってください。
キャメロンガニョン

2

パイプ、awk、sed、tr、cutなどの代わりにbashビルトインを使用してそれを行う方法を次に示します。

output="$(openssl sha1 <(printf foo))"; echo ${output/* }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.