Não tenho certeza absoluta de que entendi o que você deseja, mas acho que algo como o seguinte deve funcionar:
$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
Basicamente, eu pego a saída hexadecimal, uso sed
para torná-la uma sequência de valores hexadecimais com escape e, em seguida, uso echo -en
para fazer eco dos bytes base64
.
Podemos confirmar que a saída final corresponde ao mesmo hash com o seguinte exercício:
$ 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 .&.}
A inspeção visual mostra que nosso valor base64 corresponde ao hexadecimal original. Observe que se você usar um hexdump
pouco do xxd
que talvez precise jogar um pouco com as configurações de formato para obter a saída esperada.
echo foo | openssl dgst -binary -sha1 | base64
é equivalente e provavelmente a maneira mais limpa de fazer isso.