„openssl dgst -sha1“ erzeugt ein überflüssiges „(stdin)= “-Präfix und eine nachfolgende neue Zeile

„openssl dgst -sha1“ erzeugt ein überflüssiges „(stdin)= “-Präfix und eine nachfolgende neue Zeile

Wenn Sie diesen Befehl auf Ihrem Unix ausführen

echo -n "foo" | openssl dgst -sha1

Sie erhalten diese Ausgabe:

(stdin)= 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

(gefolgt von einer neuen Zeile).

Wie kann ich OpenSSL zwingen, das Präfix nicht anzuzeigen (stdin)=und den nachstehenden Zeilenumbruch zu vermeiden?

Antwort1

Das Rohbinärformat fügt keine überflüssige Ausgabe hinzu.
Ausgabe als Binärdatei, dann Konvertierung in Hex:

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

Ich gebe Ihnen Folgendes:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Diese Methode sollte zukunftssicher sein, falls jemand beschließt, das Textausgabeformat erneut zu ändern. Ich bin sicher, dass sie das Präfix auf „SHA1(stdin)= “ ändern werden, damit es mit dem einer Dateieingabe übereinstimmt.

Ich kann nicht glauben, dass sie das geändert haben! Ich frage mich, wie viele Skripte kaputt waren.

Antwort2

Ich beobachte dieses Verhalten unter OpenSSL 1.0.0e auf Ubuntu 11.10, während OpenSSL 0.9.8k und 0.9.8t nur den Hash ausgeben. Die Befehlszeile von OpenSSL ist nicht auf Flexibilität ausgelegt, sondern eher eine schnelle und einfache Möglichkeit, kryptografische Berechnungen von der Befehlszeile aus durchzuführen.

Wenn Sie OpenSSL verwenden möchten, filtern Sie die Ausgabe:

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //'

Unter Linux (mit GNU-Tools oder BusyBox) können Siesha1sum, das keine Installation von OpenSSL erfordert und ein stabiles Ausgabeformat hat. Es druckt immer einen Dateinamen, also entfernen Sie diesen.

echo -n "foo" | sha1sum | sed 's/ .*//'

Auf BSD-Systemen einschließlich OSX können Siesha1.

echo -n "foo" | sha1 -q

Alle diese Befehle geben die Prüfsumme in Hexadezimalschreibweise aus, gefolgt von einem Zeilenumbruch. Text unter Unix-Systemen besteht immer aus einer Folge von Zeilen, und jede Zeile endet mit einem Zeilenumbruchzeichen. Wenn Sie die Ausgabe des Befehls in einer Shell-Variable speichern, wird der letzte Zeilenumbruch entfernt.

digest=$(echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //')

Wenn Sie die Eingabe in ein Programm weiterleiten müssen, das eine Prüfsumme ohne abschließende Zeilenumbruchfunktion erfordert (was sehr selten vorkommt), entfernen Sie den Zeilenumbruch.

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program

Antwort3

Hier ist eine weitere Alternative:

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

Antwort4

So geht das mit integrierten Bash-Funktionen statt mit Pipes, awk, sed, tr, cut usw.:

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

verwandte Informationen