¿Cómo puedo obtener un shaX codificado en base64 en el cli?

32

sha1sumgenera un formato codificado hexadecimal del sha real. Me gustaría ver una variante codificada en base64. posiblemente algún comando que genere la versión binaria que pueda canalizar, como así: echo -n "message" | <some command> | base64o si lo genera directamente, también está bien.

xenoterracida
fuente

Respuestas:

41

Si tiene la utilidad de línea de comandos de OpenSSL , puede producir un resumen en forma binaria e incluso puede traducirse a base64 (en una invocación separada).

echo -n foo | openssl dgst -binary -sha1 | openssl base64
Gilles 'SO- deja de ser malvado'
fuente
1
echo foo | openssl dgst -binary -sha1 | base64es equivalente, y probablemente la forma más limpia de hacerlo.
xenoterracide el
3
El uso opensslpara base64 también tiene la ventaja de depender de una sola herramienta ( ksh: base64: not found).
Gilles 'SO- deja de ser malvado'
2
Para hashes de resumen de mensajes grandes como sha512, es posible que desee agregar una -Aopción al openssl base64comando final , para evitar dividir la cadena resultante en varias líneas.
mykhal
@Gilles ¿Por qué echo foo > somefile; cat somefile | openssl dgst -binary -sha1 | openssl base64produce una cadena diferente?
georgeliatsos
@gliatsos Porque echo -n fooy echo fooproducen diferentes cadenas.
Gilles 'SO- deja de ser malvado'
16

Dado sha1sumque no proporciona una opción para la salida binaria, es probable que necesite encontrar una utilidad que haga lo contrario ody canalizarlos. Tomando la sugerencia de fschmitt para usar xxdcon las banderas 'reverse' y 'plain dump' se verá así:

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

alex
fuente
44
Use xxd con la bandera -rp. Así: sha1sum somefile.txt | cortar -f1 -d \ | xxd -r -p | base64
fschmitt
@fschmitt: Debería haber leído este comentario antes de publicar mi respuesta, es mucho más limpio. Debería considerar publicarlo como respuesta. Yo votaría por eso.
Steven D
Es más la respuesta de Alex, simplemente busqué en Google "convertir unix binario hexadecimal", así que Alex, siéntase libre de editar su respuesta para incluir la llamada xxd y votaremos esto.
fschmitt
Edité mi respuesta. Gracias por señalar xxd:)
alex
¡increíble! Esto fue difícil de resolver a partir de la documentación httpd.apache.org/docs/2.4/misc/password_encryptions.html que no menciona la necesidad de este paso
phil294
1

No estoy completamente seguro de entender lo que quieres, pero creo que algo como lo siguiente debería funcionar:

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

Básicamente, tomo la salida hexadecimal, la uso sedpara convertirla en una cadena de valores hexadecimales escapados, y luego la uso echo -enpara hacer eco de los bytes base64.

Podemos confirmar que el resultado final corresponde al mismo hash con el siguiente ejercicio:

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

La inspección visual muestra que nuestro valor base64 coincide con el hexadecimal original. Tenga en cuenta que si usa en hexdumplugar de xxdtener que jugar un poco con la configuración de formato para obtener la salida que espera.

Steven D
fuente
1

Perl tiene un módulo base64 (en la distribución base desde 5.7.1).

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

Si tiene el Digest::SHAmódulo (en la distribución base desde 5.9.3), o el Digest::SHA1módulo anterior , puede hacer todo el cálculo en perl. A partir de perl 5.10.1, b64digestno rellena la salida base64; Si necesita relleno, la forma más fácil es usarlo 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- deja de ser malvado'
fuente
bueno, si estamos usando perl, podríamos usar el módulo Digest :: SHA que nos permitiría salir directamente a base64.
xenoterracide
0

El hash SHA256 codificado en Base64 se convirtió en una suma de comprobación de archivo estándar en OpenBSD recientemente. Se puede hacer simplemente agregando la -bopción al sha256comando de OpenBSD (o sha1, sha512):

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

o:

$ cksum -q -a sha256b $FILE
mykhal
fuente