Câu trả lời:
Tôi nhận ra đây không phải là chính xác những gì bạn đang yêu cầu, nhưng không có ích gì khi sáng tạo lại bánh xe và viết một phiên bản bash.
Bạn có thể chỉ cần sử dụng openssl
lệnh để tạo mã băm trong tập lệnh của mình.
[me@home] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Hoặc đơn giản:
[me@home] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Hãy nhớ sử dụng -n
cùng với echo
hoặc nếu không thì một ký tự ngắt dòng được nối vào chuỗi và điều đó sẽ thay đổi dữ liệu của bạn và hàm băm.
Lệnh đó đến từ gói OpenSSL đã được cài đặt sẵn (hoặc dễ dàng cài đặt) trong sự lựa chọn của bạn về Linux / Unix, Cygwin và các loại tương tự.
Xin lưu ý rằng các phiên bản cũ hơn của openssl
(chẳng hạn như được vận chuyển với RHEL4) có thể không cung cấp -hmac
tùy chọn.
Là một giải pháp thay thế, nhưng chủ yếu để chứng minh rằng kết quả là giống nhau, chúng ta cũng có thể gọi PHP hmac_sha1()
từ dòng lệnh:
[me@home]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
sha1
được thay thế bằng sha256
:-)
openssl genrsa
không? Ngoài ra, liên kết tài liệu openssl cho kết quả là 404.
Đây là một hàm bash hoạt động giống như hash_hmac
từ PHP:
#!/bin/bash
function hash_hmac {
digest="$1"
data="$2"
key="$3"
shift 3
echo -n "$data" | openssl dgst "-$digest" -hmac "$key" "$@"
}
# hex output by default
hash_hmac "sha1" "value" "key"
# raw output by adding the "-binary" flag
hash_hmac "sha1" "value" "key" -binary | base64
# other algos also work
hash_hmac "md5" "value" "key"
hash_hmac "sha1" "$(cat your-json-file)" "key"
. Ngoài ra, bạn có thể chuyển tệp của mình qua openssl dgst
mà không cần sử dụng hash_hmac
chức năng này .
Cảm ơn vì hàm hash_hmac! Nhưng nó không đủ cho ứng dụng của tôi. Trong trường hợp có ai đó thắc mắc, tôi đã phải băm lại nhiều lần bằng cách sử dụng một khóa là kết quả của lần băm trước đó và do đó là đầu vào nhị phân. (Chữ ký xác thực Amazon AWS được tạo như thế này.)
Vì vậy, những gì tôi cần là một cách cung cấp khóa nhị phân theo một cách nào đó sẽ không phá vỡ thuật toán. Sau đó, tôi tìm thấy cái này: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
Câu trả lời của Stephen Henson yêu cầu hàm hash_hmac trả về giá trị ở định dạng hex. Vì vậy, nó cần lặp lại những điều sau:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Sau đó, cuộc gọi tiếp theo sẽ cần cung cấp khóa dưới dạng hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Hy vọng rằng điều này sẽ giúp ích cho bất kỳ ai, có thể là ai đó đang cố gắng tạo tập lệnh bash để làm mất hiệu lực các mục nhập CloudFront trên AWS (giống như tôi!) (Tôi chưa thử nghiệm nó, nhưng tôi nghĩ đây là nguyên nhân tại sao tập lệnh bash của tôi không hoạt động và PHP của tôi không hoạt động ...)
Gửi đến những người muốn khám phá thêm JWT trên dòng lệnh: cool jwt bash script