"openssl dgst -sha1" は、無関係な "(stdin)=" プレフィックスと末尾の改行文字を生成します。

"openssl dgst -sha1" は、無関係な "(stdin)=" プレフィックスと末尾の改行文字を生成します。

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

echo -n "foo" | openssl dgst -sha1

以下の結果が出力されます。

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(次に改行文字が続きます)。

opensslがプレフィックスを表示せずに(stdin)=末尾の改行を避けるように強制する方法は?

答え1

raw バイナリ形式は外部出力を追加しません。
出力は2進数で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/* }

関連情報