Я не зовсім впевнений, що я розумію, чого ви хочете, але думаю, що щось подібне повинно спрацювати:
$ 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 .&.}
Візуальний огляд показує, що наше базове значення 64 відповідає оригінальному шестигранному. Зауважте, що якщо ви використовуєте, hexdump
а не xxd
вам, можливо, доведеться трохи грати з налаштуваннями формату, щоб отримати вихід, який ви очікуєте.
echo foo | openssl dgst -binary -sha1 | base64
рівнозначний, і, мабуть, найчистіший спосіб зробити це.