Bộ tạo HMAC

HMAC là thuật toán nền tảng cho hầu hết các webhook có chữ ký, tiêu đề AWS Signature phiên bản 4 và token JWT HS256. Chỉ cần nhập một thông điệp cùng khóa bí mật, chọn một họ hàm mã hóa, bộ tạo này sẽ sinh ra giá trị HMAC đúng như quy định trong RFC 2104 – rất hữu ích để xác minh nội dung dữ liệu sắp được gửi từ hệ thống phía sau hoặc tái tạo chữ ký nhận được từ một API.

Cách tính giá trị HMAC

  1. 1

    Dán thông điệp

    Các byte cụ thể cần được ký, một payload của webhook, một yêu cầu chuẩn, hoặc bất kỳ chuỗi nào.

  2. 2

    Nhập khóa bí mật

    Có thể là văn bản hoặc giá trị thập lục phân (hex). Bộ tạo sẽ đệm hoặc băm khóa cho vừa kích thước khối theo quy định của RFC.

  3. 3

    Chọn thuật toán mã hóa hash

    SHA-256 là giá trị mặc định; bạn có thể chọn SHA-1, SHA-384, SHA-512 hoặc MD5 để đảm bảo tương thích với các hệ thống cũ.

  4. 4

    Sao chép chữ ký

    Đầu ra là định dạng hex viết thường, sẵn sàng dán vào cấu hình webhook hoặc tiêu đề Authorization.

HMAC bên trong hệ thống

HMAC bao bọc một hàm băm thông thường trong một cấu trúc có khóa, nhằm đảm bảo chữ ký không thể bị giả mạo nếu thiếu khóa.

Công thức RFC 2104

HMAC(k, m) = H((k' ⊕ opad) ∥ H((k' ⊕ ipad) ∥ m))

trong đó k' là khóa được đệm cho vừa kích thước khối băm, còn opad = 0x5c repeatedipad = 0x36 repeated là các hằng số đệm.

Các lựa chọn thuật toán

Thuật toán Kích thước khối Độ dài đầu ra Khuyến nghị cho
HMAC-SHA-256 64 byte 32 byte Giá trị mặc định hiện đại, dùng để ký chữ ký webhook
HMAC-SHA-384 128 byte 48 byte Chữ ký API với mức độ bảo mật cao hơn
HMAC-SHA-512 128 byte 64 byte Token có tuổi thọ dài
HMAC-SHA-1 64 byte 20 byte Phiên bản cũ (AWS S3 v2, OAuth 1.0)
HMAC-MD5 64 byte 16 byte Chỉ dùng cho phiên bản cũ; không nên sử dụng trong các ứng dụng mới

Nơi mà HMAC xuất hiện

  • GitHub, Stripe, Shopify webhook: tiêu đề X-Hub-Signature-256, Stripe-Signature, v.v.
  • AWS Signature v4: một chuỗi chữ ký HMAC-SHA256 được áp dụng lên yêu cầu chuẩn.
  • JWT HS256: chữ ký của token là HMAC-SHA-256(header.payload, secret).
  • Token khôi phục mật khẩu: HMAC được tính từ user_id, thời hạn hết hạn và mật mã riêng của trang web.

Các lỗi phổ biến

  • Truyền khóa được mã hóa hex dưới dạng văn bản thay vì giải mã nó thành các byte trước tiên.
  • Ký sai các byte tải trọng (payload): một số webhook ký toàn bộ thân yêu cầu thô (bao gồm cả khoảng trắng), trong khi những webhook khác lại ký theo dạng chuẩn.
  • Dùng == trong JavaScript hoặc Python để so sánh chữ ký; luôn áp dụng cách so sánh an toàn về thời gian (timing-safe) nhằm chống lại các cuộc tấn công dựa trên thời gian.

Câu hỏi thường gặp

Hầu như luôn là do các byte thông điệp khác nhau. Việc ký vào phần nội dung đã được phân tích dưới dạng JSON sẽ gây ra sự thay đổi về khoảng trắng; vì vậy nên ký trực tiếp vào phần nội dung yêu cầu thô. Đồng thời, cần kiểm tra xem khóa có được giải mã theo cùng một cách (từ dạng hex đến dạng byte thô) ở cả hai phía hay không.

Đúng vậy. Nếu khóa ngắn hơn kích thước khối hash thì sẽ được lấp đầy bằng các bit không; nếu dài hơn thì sẽ được thực hiện phép tính hash trước tiên. RFC 2104 khuyến nghị rằng độ dài khóa phải ít nhất bằng độ dài kết quả đầu ra (32 byte đối với SHA-256).

HMAC vẫn có khả năng chống lại các cuộc tấn công va chạm MD5 đã biết, bởi vì cơ chế tấn công này không ảnh hưởng đến quá trình xây dựng hàm HMAC. Tuy nhiên, bạn nên sử dụng HMAC-SHA-256 cho mọi mã nguồn mới – cả các công cụ phát triển lẫn các tổ chức kiểm toán đều yêu cầu điều này.

Có. Thông điệp và khóa bí mật được gửi tới máy chủ của chúng tôi qua kết nối HTTPS được mã hóa để tính toán HMAC. Chúng chỉ được dùng cho việc tính toán và không được lưu trữ hay ghi nhật ký.

Công cụ liên quan

Công cụ này có phiên bản bằng các ngôn ngữ khác