Come posso ottenere un shaX con codifica base64 sul cli?


32

sha1sumgenera un formato codificato esadecimale dello sha reale. Vorrei vedere una variante codificata in base64. forse qualche comando che emette la versione binaria che posso eseguire il pipe, in questo modo: echo -n "message" | <some command> | base64o se lo emette direttamente va bene.

Risposte:


41

Se disponi dell'utilità della riga di comando di OpenSSL , può produrre un digest in forma binaria e può persino tradurre in base64 (in una chiamata separata).

echo -n foo | openssl dgst -binary -sha1 | openssl base64

1
echo foo | openssl dgst -binary -sha1 | base64è equivalente e probabilmente il modo più pulito per farlo.
xenoterracide,

3
L'uso anche opensslper base64 ha il vantaggio di dipendere da un solo strumento ( ksh: base64: not found).
Gilles 'SO- smetti di essere malvagio' il

2
Per hash digest di messaggi di grandi dimensioni come sha512, potresti voler aggiungere -Aun'opzione al openssl base64comando finale , per evitare di dividere la stringa risultante in più righe.
mykhal,

@Gilles Perché echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64produce una stringa diversa?
georgeliatsos,

@gliatsos Perché echo -n fooe echo fooprodurre stringhe diverse.
Gilles 'SO- smetti di essere malvagio' il

16

Poiché sha1sumnon fornisce un'opzione per l'output binario, probabilmente dovrai trovare un'utilità che fa il contrario di ode convogliarli. Prendendo il suggerimento di fschmitt da usare xxdcon i flag 'reverse' e 'plain dump' sarà simile a questo:

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


4
Usa xxd con il flag -rp. In questo modo: sha1sum somefile.txt | taglia -f1 -d \ | xxd -r -p | base64
fschmitt

@fschmitt: avrei dovuto leggere questo commento prima di pubblicare la mia risposta, è molto più pulito. Dovresti considerare di pubblicarlo come una risposta. Vorrei votare per questo.
Steven D

È la risposta più alex, ho appena cercato su Google "converti unex binario esadecimale", quindi alex, sentiti libero di modificare la tua risposta per includere la chiamata xxd e voteremo questo.
fschmitt,

Modificato la mia risposta. Grazie per la segnalazione xxd:)
alex,

eccezionale! Questo è stato difficile da capire dalla documentazione httpd.apache.org/docs/2.4/misc/password_encryptions.html che non menziona la necessità di questo passaggio
phil294,

1

Non sono completamente sicuro di aver capito cosa vuoi, ma penso che dovrebbe funzionare qualcosa di simile al seguente:

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

Fondamentalmente, prendo l'output esadecimale, lo uso sedper renderlo una stringa di valori esadecimali sfuggiti, e quindi uso echo -enper riecheggiare i byte in base64.

Possiamo confermare che l'output finale corrisponde allo stesso hash con il seguente esercizio:

$ 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                                .&.}

L'ispezione visiva mostra che il nostro valore base64 corrisponde all'esagono originale. Nota che se usi hexdumppiuttosto che xxdpotresti dover giocare un po 'con le impostazioni del formato per ottenere l'output che ti aspetti.


1

Perl ha un modulo base64 (nella distribuzione base dal 5.7.1).

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

Se hai il Digest::SHAmodulo (nella distribuzione base dal 5.9.3), o il Digest::SHA1modulo più vecchio , puoi fare l'intero calcolo in perl. A partire da perl 5.10.1, b64digestnon riempie l'output di base64; se hai bisogno di imbottitura, il modo più semplice è usare 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)'

bene se stiamo usando perl, potremmo semplicemente usare il modulo Digest :: SHA che ci permetterebbe di produrre direttamente su base64.
xenoterracide,

0

L'hash SHA256 con codifica Base64 è diventato di recente un checksum di file standard in OpenBSD . Può essere fatto semplicemente aggiungendo -bun'opzione al sha256comando di OpenBSD (o sha1, sha512):

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

o:

$ cksum -q -a sha256b $FILE
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.