Câu hỏi HMAC-SHA1 trong bash


Có một kịch bản bash để tạo ra một HMAC-SHA1 băm?

Tôi đang tìm một cái gì đó tương đương với mã PHP sau đây:

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

76
2017-09-02 14:36


gốc




Các câu trả lời:


Tôi nhận ra đây không phải là những gì bạn đang yêu cầu, nhưng không có điểm nào trong việc phát minh lại bánh xe và viết một phiên bản bash.

Bạn chỉ có thể sử dụng openssl lệnh để tạo băm trong tập lệnh của bạn.

[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

Nhớ sử dụng -n với echo hoặc một ký tự ngắt dòng khác đượ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 sự lựa chọn của bạn về Linux / Unix, Cygwin và những thứ 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 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 các kết quả đều 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

147
2017-09-02 14:52



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 một nguồn với điều đó không? - sehe
Tôi có cùng câu hỏi với HMAC-SHA256. Cùng một giải pháp, nhưng sha1 được thay thế bằng sha256 :-) - mogsie
Có, bạn có thể, nhưng hãy xem ra cho các dấu ngắt dòng trong tệp của bạn vì nó cũng sẽ được coi là một phần của giá trị. - Shawn Chin
@ShawnChin, trong ví dụ này, mã hóa / định dạng của khóa là gì? Nếu đó là mã hóa base64 như khóa riêng được tạo bằng openssl genrsa? Ngoài ra, liên kết tài liệu openssl sẽ dẫn đến 404. - Carlos Macasaet


Đây là một hàm 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" "$@"
}

# 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"

32
2017-09-12 08:36



Đó là một cách hay để kết thúc nó. +1 - Shawn Chin
cảm ơn cho -binary :) - Manav
1 bởi 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.) - Alexx Roche
@Mark Đây phải là câu trả lời được chấp nhận. - Yokai
nhưng, làm thế nào để bạn vượt qua đối số 'dữ liệu' để kịch bản nếu nó là nhiều dòng? Giống như một cơ thể xml hoặc json mà không mất thụt đầu dòng. - HyperioN


Cảm ơn hàm 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 một 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

Câu trả lời của Stephen Henson yêu cầu hàm hash_hmac trả về giá trị theo định dạng hex. Vì vậy, nó cần phải echo những điều sau đây:

$ echo -n "$data" | openssl dgst "-$digest" -hmac "$key" | sed -e 's/^.* //'

Sau đó, cuộc gọi tiếp theo sẽ cần phải 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 bất cứ ai, có lẽ ai đó đang cố gắng tạo các script bash để vô hiệu hóa các mục CloudFront trên AWS (như tôi!) (Tôi chưa thử nghiệm nó, nhưng tôi nghĩ đây là nguyên nhân của 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 ...)


3
2018-03-13 05:13





Đối với những người muốn khám phá thêm JWT trên dòng lệnh: mát mẻ jwt bash script


0
2018-02-07 23:04