Я не совсем уверен, что понимаю, чего вы хотите, но я думаю, что-то вроде следующего должно работать:
$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
По сути, я беру шестнадцатеричный вывод, использую sed
для создания строки экранированных шестнадцатеричных значений, а затем использую echo -en
для вывода байтов в base64
.
Мы можем подтвердить, что окончательный результат соответствует тому же хешу с помощью следующего упражнения:
$ 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 .&.}
Визуальный осмотр показывает, что наше значение base64 соответствует исходному гексу. Обратите внимание, что если вы используете, hexdump
а не xxd
вам, возможно, придется немного поиграть с настройками формата, чтобы получить ожидаемый результат.
echo foo | openssl dgst -binary -sha1 | base64
эквивалентно, и, вероятно, самый чистый способ сделать это.