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.
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
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.
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