Tôi không hoàn toàn chắc chắn tôi hiểu những gì bạn muốn, nhưng tôi nghĩ một cái gì đó như sau sẽ hoạt động:
$ echo -ne "$(echo -n "message" | sha1sum | cut -f1 -d" " | sed -e 's/\(.\{2\}\)/\\x\1/g')" | base64
Về cơ bản, tôi lấy đầu ra hex, sử dụng sed
để biến nó thành một chuỗi các giá trị hex được thoát, và sau đó sử dụng echo -en
để lặp lại các byte vào base64
.
Chúng tôi có thể xác nhận rằng đầu ra cuối cùng tương ứng với cùng một hàm băm với bài tập sau:
$ 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 .&.}
Kiểm tra trực quan cho thấy giá trị base64 của chúng tôi khớp với hex gốc. Lưu ý rằng nếu bạn sử dụng hexdump
thay vì xxd
bạn có thể phải chơi với các cài đặt định dạng một chút để có được đầu ra mà bạn mong đợi.
echo foo | openssl dgst -binary -sha1 | base64
là tương đương, và có lẽ là cách sạch nhất để làm điều này.