Công cụ làm gì
HMAC (mã xác thực thông điệp dựa trên hash, RFC 2104) kết hợp một khóa bí mật với hàm băm để ký thông điệp. Người nhận biết cùng khóa sẽ tính lại HMAC và so với giá trị được gửi kèm. Nếu thông điệp bị sửa hoặc người gửi không biết khóa, hai giá trị sẽ không khớp.
HMAC có mặt khắp nơi: chữ ký webhook (GitHub, Stripe, Slack), yêu cầu API có ký, JWT dùng HS256, ký cookie và mật khẩu dùng một lần. Công cụ này tính cùng lúc HMAC-MD5, HMAC-SHA1, HMAC-SHA256, HMAC-SHA384 và HMAC-SHA512 để bạn đối chiếu với thuật toán hệ thống đang dùng.
Cách sử dụng
- Nhập Khóa bí mật. Đổi Định dạng khóa nếu khóa được cho dưới dạng byte hex hoặc Base64 thay vì văn bản.
- Dán Thông điệp hoặc bấm Ví dụ.
- Mọi HMAC cập nhật ngay khi bạn gõ. Chọn đầu ra Hex hoặc Base64 rồi sao chép giá trị cần dùng.
Thông điệp được mã hóa UTF-8 đúng như bạn nhập, kể cả khoảng trắng và xuống dòng.
Ví dụ
Với khóa key và thông điệp The quick brown fox jumps over the lazy dog, HMAC-SHA256 là f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8. Bạn có thể kiểm tra trên dòng lệnh:
echo -n "The quick brown fox jumps over the lazy dog" | openssl dgst -sha256 -hmac "key"
Chú ý -n: thiếu nó, echo sẽ thêm dấu xuống dòng và HMAC sẽ khác.
Xác minh webhook
Để xác minh webhook, lấy nội dung yêu cầu gốc trước khi phân tích JSON, ghép chuỗi theo tài liệu của nhà cung cấp (thường là timestamp.body), tính HMAC bằng khóa ký của bạn rồi so với header chữ ký. Trong mã của bạn, hãy so sánh chữ ký bằng hàm thời gian hằng định để tránh tấn công định thời.
Câu hỏi thường gặp
› Hash và HMAC khác nhau thế nào?
Ai cũng có thể tính một hash thông thường như SHA-256. HMAC trộn một khóa bí mật vào hash, nên chỉ người biết khóa mới tạo hoặc kiểm tra được giá trị. Đó là mã xác thực thông điệp, không chỉ là checksum.
› Nên dùng thuật toán HMAC nào?
Thường dùng HMAC-SHA256, đây là thuật toán hầu hết API và webhook yêu cầu. HMAC-SHA512 cũng tốt. HMAC-MD5 và HMAC-SHA1 vẫn được coi là an toàn khi dùng làm MAC, nhưng chỉ nên dùng khi hệ thống cũ bắt buộc.
› Vì sao HMAC của tôi không khớp với máy chủ?
Kiểm tra chính xác các byte của thông điệp (một dấu xuống dòng ở cuối hay khoảng trắng JSON khác đều làm kết quả thay đổi hoàn toàn), định dạng khóa (văn bản, hex hay Base64) và mã hóa đầu ra. Nhà cung cấp webhook thường ký một chuỗi ghép từ dấu thời gian và nội dung yêu cầu gốc.
› Khóa bí mật của tôi có bị lưu hay gửi đi không?
Không. HMAC được tính trong trình duyệt. Khóa chỉ nằm trong bộ nhớ của trang này: không được lưu, không ghi lên thanh địa chỉ và không đưa vào liên kết chia sẻ.