Wie kann ich ein Base64-codiertes ShaX auf dem Cli bekommen?

31

sha1sumgibt ein hexadezimal codiertes Format des tatsächlichen sha aus. Ich würde gerne eine Base64-codierte Variante sehen. Möglicherweise gibt ein Befehl die Binärversion aus, die ich per Pipe ausgeben kann: echo -n "message" | <some command> | base64oder wenn er sie direkt ausgibt, ist das auch in Ordnung.

Xenoterracid
quelle

Antworten:

40

Wenn Sie das Befehlszeilendienstprogramm von OpenSSL verwenden , kann es einen Digest in binärer Form erstellen und sogar in base64 übersetzen (in einem separaten Aufruf).

echo -n foo | openssl dgst -binary -sha1 | openssl base64
Gilles 'SO - hör auf böse zu sein'
quelle
1
echo foo | openssl dgst -binary -sha1 | base64ist gleichwertig und wahrscheinlich die sauberste Art, dies zu tun.
Xenoterracid
3
Die Verwendung auch opensslfür base64 hat den Vorteil, dass nur ein Tool erforderlich ist ( ksh: base64: not found).
Gilles 'SO- hör auf böse zu sein'
2
Bei umfangreichen Nachrichten-Digest-Hashes wie sha512möchten Sie möglicherweise -Adem endgültigen openssl base64Befehl eine Option hinzufügen , um zu verhindern, dass die resultierende Zeichenfolge in mehrere Zeilen aufgeteilt wird.
Mykhal
@Gilles Warum echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64wird eine andere Zeichenfolge erstellt?
Georgeliatsos
@gliatsos Weil echo -n foound echo fooverschiedene Saiten produzieren.
Gilles 'SO- hör auf böse zu sein'
15

Schon seit sha1sum es keine Option für die Binärausgabe gibt, müssen Sie wahrscheinlich ein Hilfsprogramm finden, das das Gegenteil von tut odund sie weiterleitet. Wenn fschmitt vorschlägt, xxdmit 'reverse' und 'plain dump' Flags zu arbeiten, sieht es so aus:

sha1sum | cut -f1 -d\ | xxd -r -p | base64

Alex
quelle
4
Verwenden Sie xxd mit dem Flag -rp. Wie folgt: sha1sum somefile.txt | schneiden Sie -f1 -d \ | xxd -r -p | base64
fschmitt
@fschmitt: Ich hätte diesen Kommentar vor dem Posten meiner Antwort lesen sollen, er ist viel sauberer. Sie sollten es als Antwort veröffentlichen. Ich würde dafür stimmen.
Steven D
Es ist mehr Alex Antwort, ich habe nur gegoogelt "Hex-Binär-Unix konvertieren", also Alex, zögern Sie nicht, Ihre Antwort zu bearbeiten, um den xxd-Aufruf einzuschließen, und wir werden dies abstimmen.
fschmitt
Bearbeitet meine Antwort. Vielen Dank für den Hinweis xxd:)
alex
genial! Dies war aus der Dokumentation httpd.apache.org/docs/2.4/misc/password_encryptions.html, in der die Notwendigkeit dieses Schritts nicht erwähnt wird, schwer herauszufinden
phil294
1

Ich bin nicht ganz sicher, ob ich verstehe, was Sie wollen, aber ich denke, Folgendes sollte funktionieren:

$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64

Grundsätzlich nehme ich die hexadezimale Ausgabe, verwende sie sed, um eine Zeichenfolge mit Escapezeichen für hexadezimale Werte zu erstellen, und verwende sie dann, echo -enum die Bytes wiederzugeben base64.

Mit der folgenden Übung können wir bestätigen, dass die endgültige Ausgabe demselben Hash entspricht:

$ echo -n "message" | sha1sum 
6f9b9af3cd6e8b8a73c2cdced37fe9f59226e27d  -

$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
b5ua881ui4pzws3O03/p9ZIm4n0=

$ echo -n "b5ua881ui4pzws3O03/p9ZIm4n0=" | base64 -d | xxd
0000000: 6f9b 9af3 cd6e 8b8a 73c2 cdce d37f e9f5  o....n..s.......
0000010: 9226 e27d                                .&.}

Eine Sichtprüfung zeigt, dass unser base64-Wert mit dem ursprünglichen Hex übereinstimmt. Beachten Sie, dass Sie, wenn Sie die hexdumpFormateinstellungen verwenden xxd, möglicherweise ein wenig mit ihnen spielen müssen, um die erwartete Ausgabe zu erzielen.

Steven D
quelle
1

Perl hat ein base64-Modul (in der Basisdistribution seit 5.7.1).

echo foo | sha1sum | \
perl -MMIME::Base64 -ne '/^([[:xdigit:]]+)/ and print encode_base64(pack("H*",$1))'

Wenn Sie das Digest::SHAModul (in der Basisdistribution seit 5.9.3) oder das ältere Digest::SHA1Modul haben, können Sie die gesamte Berechnung in Perl durchführen. Füllt ab Perl 5.10.1 b64digestdie base64-Ausgabe nicht auf. Wenn Sie eine Polsterung benötigen, verwenden Sie diese am einfachsten MIME::Base64.

perl -MDigest::SHA -e 'print Digest::SHA->new(1)->addfile(*STDIN)->b64digest'
perl -MMIME::Base64 -MDigest::SHA \
     -le 'print encode_base64(Digest::SHA->new(1)->addfile(*STDIN)->digest)'
Gilles 'SO - hör auf böse zu sein'
quelle
Wenn wir Perl verwenden, können wir einfach das Digest :: SHA-Modul verwenden, mit dem wir direkt auf base64 ausgeben können.
Xenoterracide
0

Base64-codierter SHA256-Hash wurde in letzter Zeit eher zur Standard-Prüfsumme für Dateien in OpenBSD . Dies kann einfach durch Hinzufügen einer -bOption zum OpenBSD- sha256Befehl (oder sha1, sha512) erfolgen:

$ FILE=/dev/null
$ sha256 -q -b $FILE
47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=

oder:

$ cksum -q -a sha256b $FILE
Mykhal
quelle