"Openssl dgst -sha1" erzeugt ein äußeres "(stdin) =" Präfix und eine nachfolgende Newline

31

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 erzwingen (stdin)=, dass openssl das Präfix nicht anzeigt, und die nachfolgende Newline vermeiden?

Kevdog777
quelle
@ MarkDavidson Hmm, interessant. Sind Sie sicher, dass nicht einmal eine neue Zeile angehängt wird?

Antworten:

22

Das binäre Rohformat fügt keine externen Ausgaben hinzu.
Als Binärdatei ausgeben und dann in Hex umwandeln:

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

Wird dir folgendes geben:

0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33

Diese Methode sollte zukunftssicher sein, falls sich jemand entscheidet, das Textausgabeformat erneut zu ändern. Ich bin sicher, sie werden das Präfix auf "SHA1 (stdin) =" setzen, um mit dem einer Dateieingabe übereinzustimmen.

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

Böser Hacker
quelle
4
Es werden nur 20-30 Oktette pro Zeile (oder 40-60 Zeichen) ausgegeben. Bei einer SHA-256-Prüfsumme reicht dies manchmal nicht aus. Verwenden Sie die -c 256Option, um die Länge auf 256 Bytes pro Zeile zu erweitern.
Rockallite
16

Ich beobachte dieses Verhalten unter OpenSSL 1.0.0e unter Ubuntu 11.10, während OpenSSL 0.9.8k und 0.9.8t nur den Hash ausgeben. Die Befehlszeile von OpenSSL ist nicht flexibel, sondern eher eine schnelle und unkomplizierte Methode, um kryptografische Berechnungen über die Befehlszeile 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 Sie sha1sumOpenSSL verwenden , das keine Installation erfordert und ein stabiles Ausgabeformat aufweist. Es wird immer ein Dateiname gedruckt, also entfernen Sie diesen.

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

Auf BSD-Systemen einschließlich OSX können Sie verwenden sha1.

echo -n "foo" | sha1 -q

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

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

Wenn Sie die Eingabe in ein Programm umleiten müssen, für das eine Prüfsumme ohne letzte Newline erforderlich ist (was sehr selten vorkommt), entfernen Sie die Newline.

echo -n "foo" | openssl dgst -sha1 | sed 's/^.* //' | tr -d '\n' | unusual_program
Gilles 'SO - hör auf böse zu sein'
quelle
das ist die perfekte situation => copy & paste solution map. Vielen Dank!
Oberstet
6

Hier ist eine andere Alternative:

echo -n "foo" | openssl sha1 | awk '{print $2}'
Vishnu Kumar
quelle
1
Ich weiß, dass die Frage mit diesem bestimmten Format gestellt wird. Wenn jedoch jemand versucht, dies zu erweitern, um Dateinamen einzuschließen, kann dies zu Fehlern führen, wenn der Dateiname Leerzeichen enthält. Nur ein Köpfchen für andere Leute, die hier landen.
Cameron Gagnon
2

Hier ist eine Möglichkeit, wie Sie Bash-Built-Ins anstelle von Pipes, awk, sed, tr, cut usw. verwenden können:

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