HMAC-SHA1 trong bash


95

Có tập lệnh bash để tạo HMAC-SHA1hash không?

Tôi đang tìm kiếm thứ gì đó tương đương với mã PHP sau:

hash_hmac("sha1", "value", "key");

Câu trả lời:


185

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 openssllệ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 -ncùng với echohoặ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 -hmactù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

Việc triển khai OpenSSL rất chậm. Nếu thỉnh thoảng bạn cần làm điều đó thì không sao, nhưng nếu bạn đang cố gắng tính toán số lượng lớn các hàm băm, bạn muốn điều tra các cách khác nhau.
Marcin

1
@Marcin: bạn có thể trích dẫn nguồn với cái đó không?
sehe

6
Tôi có cùng câu hỏi với HMAC-SHA256. Các giải pháp tương tự, nhưng sha1được thay thế bằng sha256:-)
mogsie

1
Có, bạn có thể, nhưng hãy cẩn thận với các dấu ngắt dòng trong tệp của bạn vì đó cũng sẽ được coi là một phần của giá trị.
Shawn Chin,

1
@ShawnChin, trong ví dụ này, mã hóa / định dạng của khóa là gì? Nó có phải là một mã hóa base64 giống như một khóa riêng được tạo bằng cách sử dụng openssl genrsakhông? Ngoài ra, liên kết tài liệu openssl cho kết quả là 404.
Carlos Macasaet

40

Đây là một hàm bash hoạt động giống như hash_hmactừ 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"

Đó là một cách tốt để kết thúc nó. +1
Shawn Chin

+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 yêu cầu. (Mặc dù cả hai đều có ích.)
Alexx Roche

nhưng, làm thế nào để bạn chuyển đối số 'dữ liệu' vào tập lệnh nếu nó là nhiều dòng? Giống như một cơ thể xml hoặc json mà không làm mất thụt lề.
HyperioN

@HyperioN nếu bạn có dữ liệu json của bạn trong một tập tin bạn chỉ có thể làm điều này: 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 dgstmà không cần sử dụng hash_hmacchức năng này .
Martin,

9

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 ...)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.