「openssl dgst -sha1」產生無關的「(stdin)=」前綴和尾隨換行符

「openssl dgst -sha1」產生無關的「(stdin)=」前綴和尾隨換行符

如果您在 Unix 上執行此命令

echo -n "foo" | openssl dgst -sha1

您將得到以下輸出:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(後跟換行符)。

如何強制 openssl 不顯示前綴(stdin)=並避免尾隨換行符號?

答案1

原始二進位格式不會添加任何無關的輸出。
輸出為二進位,然後轉換為十六進位:

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

所有這些都以十六進制輸出校驗和,後面跟著換行符。 Unix 系統下的文字總是由一系列行組成,每行以換行符號結尾。如果將命令的輸出儲存在 shell 變數中,則最後的換行符號將被刪除。

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

這是使用 bash 內建函數而不是管道、awk、sed、tr、cut 等來完成此操作的方法:

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

相關內容