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 sed
para convertirla en una cadena de valores hexadecimales escapados, y luego la uso echo -en
para 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 hexdump
lugar de xxd
tener que jugar un poco con la configuración de formato para obtener la salida que espera.
echo foo | openssl dgst -binary -sha1 | base64
es equivalente, y probablemente la forma más limpia de hacerlo.