Có tập lệnh bash để tạo mã băm HMAC-SHA1
không?HMAC-SHA1 trong bash
Tôi đang tìm một cái gì đó tương đương với mã PHP sau:
hash_hmac("sha1", "value", "key");
Có tập lệnh bash để tạo mã băm HMAC-SHA1
không?HMAC-SHA1 trong bash
Tôi đang tìm một cái gì đó tương đương với mã PHP sau:
hash_hmac("sha1", "value", "key");
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ó điểm trong reinventing the wheel và viết một bash phiên bản.
Bạn chỉ cần sử dụng lệnh openssl
để tạo mã băm trong tập lệnh của mình.
[[email protected]] echo -n "value" | openssl dgst -sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Hoặc đơn giản là:
[[email protected]] echo -n "value" | openssl sha1 -hmac "key"
57443a4c052350a44638835d64fd66822f813319
Hãy nhớ sử dụng -n
với echo
hoặc khác một nhân vật ngắt dòng được nối vào chuỗi và thay đổi dữ liệu của bạn và băm.
Lệnh đó đến từ gói OpenSSL đã được cài đặt (hoặc dễ dàng cài đặt) trong lựa chọn Linux/Unix, Cygwin và các mục tương tự.
Lưu ý rằng các phiên bản cũ hơn của openssl
(chẳng hạn như được giao với RHEL4) có thể không cung cấp tùy chọn -hmac
.
Là một giải pháp thay thế, nhưng chủ yếu là để chứng minh rằng các kết quả đều giống nhau, chúng tôi cũng có thể gọi PHP hmac_sha1()
từ dòng lệnh:
[[email protected]]$ echo '<?= hash_hmac("sha1", "value", "key") ?>' | php
57443a4c052350a44638835d64fd66822f813319
Đây là một chức năng bash hoạt độ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" "[email protected]"
}
# 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"
Đó là cách hay để kết thúc. +1 –
cảm ơn vì nhị phân :) – Manav
+1 vì không giống như câu trả lời đã chọn, câu trả lời này trả lời câu hỏi được hỏi. (Mặc dù cả hai đều hữu ích.) –
Cảm ơn chức năng hash_hmac! Nhưng nó không đủ cho ứng dụng của tôi. Trong trường hợp bất cứ ai tự hỏi, tôi đã phải băm lại công cụ nhiều lần bằng cách sử dụng một khóa là kết quả của băm trước đó, và do đó là một đầu vào nhị phân. (Chữ ký xác thực Amazon AWS được tạo ra 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 cách nào đó sẽ không phá vỡ thuật toán. Sau đó, tôi thấy điều này: http://openssl.6102.n7.nabble.com/command-line-hmac-with-key-in-hex-td6754.html
Trả lời của Stephen Henson yêu cầu hàm hash_hmac trả về giá trị ở định dạng thập lục phân. Vì vậy, nó cần phải vang như sau:
$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'
Sau đó các cuộc gọi tiếp theo sẽ cần phải cung cấp chìa khóa như một hexit:
$ echo -n "$data" | openssl dgst "-$digest" -mac HMAC -macopt "hexkey:$key" | sed -e 's/^.* //'
Hy vọng rằng điều này giúp bất cứ ai, có lẽ ai đó đang cố gắng để tạo ra các kịch bản bash để vô hiệu hóa các mục nhập CloudFront trên AWS (như tôi!) (Tôi chưa thử nghiệm, nhưng tôi nghĩ đây là nguyên nhân gây ra lý do 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 ...)
Đối với những người muốn khám phá thêm JWT trên dòng lệnh: cool jwt bash script
Triển khai OpenSSL rất chậm.Nếu bạn cần phải làm điều đó đôi khi đó là tốt, nhưng nếu bạn đang cố gắng để tính toán một lượng lớn băm, bạn muốn điều tra con đường khác nhau. – Marcin
@Marcin: bạn có thể trích dẫn nguồn đó không? – sehe
[John The Ripper] (http://www.openwall.com/john/) rất nhanh để triển khai CPU và đó là Mã nguồn mở. – Marcin