it-swarm-es.tech

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

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

33
xenoterracide

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

Ya que sha1sum no proporciona una opción para la salida binaria, probablemente necesite encontrar una utilidad que haga lo contrario de od y canalizarlos. Tomando la sugerencia de fschmitt de usar xxd con las banderas 'reverse' y 'plain dump' se verá así:

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

16
alex

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, uso sed para convertirla en una cadena de valores hexadecimales escapados, y luego uso echo -en para hacer eco de los bytes en 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 hexdump en lugar de xxd puede que tenga que jugar un poco con la configuración de formato para obtener la salida que espera.

1
Steven D

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 tienes el Digest::SHA módulo (en la distribución base desde 5.9.3), o el anterior Digest::SHA1 módulo, puedes hacer todo el cálculo en Perl. A partir de Perl 5.10.1, b64digest no rellena la salida de base64; si necesita relleno, la forma más fácil es usar 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)'

El hash SHA256 codificado en Base64 se convirtió en una suma de comprobación de archivo bastante estándar en OpenBSD recientemente. Se puede hacer simplemente agregando -b opción para OpenBSD's sha256 (o sha1, sha512) comando:

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

o:

$ cksum -q -a sha256b $FILE
0
mykhal