Thêm game tại WuGames.ioTài trợKhám phá kho game trình duyệt miễn phí — chơi ngay, không tải, không đăng ký.Chơi ngay

Tạo HMAC - Mã hóa HMAC

Tạo và xác minh chữ ký HMAC (SHA256/SHA512/SHA1/MD5). So sánh chữ ký webhook, ký request AWS và JWT HS256. Hex hoặc Base64, 100% trên trình duyệt.

⚠️ Không bao giờ chia sẻ secret key công khai!
Xác minh chữ ký webhook/API: dán vào đây và chúng tôi so sánh với HMAC vừa tạo.

Tạo HMAC - Generate Message Authentication Codes Online

HMAC (Hash-based Message Authentication Code) là nguyên thủy mật mã cấp năng lượng cho hầu như mọi sơ đồ xác thực API trong production: AWS Signature v4, chữ ký webhook Stripe, secret GitHub Actions, xác minh request Slack, ký request Twilio, callback sự kiện Mailgun, mọi JWT với alg HS256/HS384/HS512, và toàn bộ spec token MAC OAuth 2.0 đều quy về HMAC ở cốt lõi. Được chuẩn hóa trong RFC 2104 (Krawczyk, Bellare, Canetti, 1997) và được chứng minh an toàn theo giả định chuẩn về hash nền, HMAC nhận hai đầu vào — KEY bí mật chia sẻ và MESSAGE — và tạo chữ ký kích thước cố định mà bất kỳ ai có key đều có thể tái dẫn xuất và so sánh. Điều này khác biệt cơ bản với hash thuần như sha256(message): không có key, attacker có thể tính sha256 riêng của bất kỳ message bị giả mạo nào và thay thế của bạn; với HMAC, họ không thể giả mạo chữ ký khớp mà không biết key. Trình tạo này chạy implementation WebCrypto đầy đủ phía client và hỗ trợ cả ba biến thể họ SHA-2 (SHA-256 cho hầu hết ứng dụng hiện đại, SHA-512 cho ứng dụng bảo mật cao, SHA-1 cho hệ thống legacy mà bạn nên đang chuyển khỏi), với output cả hexadecimal (định dạng text-safe phổ quát cho header và config file) và base64 (chuẩn cho chữ ký JWT và nhiều API auth). Không bao giờ tái sử dụng secret giữa các dịch vụ, không bao giờ nhúng nó vào code phía client, và rotate định kỳ. Xem thêm Tạo SHA-512 HashTạo MD5 Hash.

HMAC là gì?

HMAC (Hash-based Message Authentication Code) là một thuật toán mật mã kết hợp hàm băm với secret key để tạo mã xác thực thông điệp.

Tính năng chính:
- Xác minh cả tính toàn vẹn và xác thực dữ liệu
- Yêu cầu secret key (được chia sẻ giữa người gửi/nhận)
- Dựa trên các hàm băm chuẩn (SHA-256, SHA-512, v.v.)
- Được sử dụng trong APIs, JWTs, webhooks và giao tiếp an toàn

HMAC = Hash(secret_key + message)

Ví dụ:
Thông điệp: "Hello, World!"
Secret: "mySecretKey"
HMAC-SHA256: a4e624d686e03ed2767c0abd85c14426b0b1157d2ce81d27bb4fe4bc1e4fa3a6

Làm thế nào để tạo HMAC?

1. Nhập thông điệp/dữ liệu của bạn
2. Nhập secret key của bạn
3. Chọn thuật toán hash (khuyến nghị SHA-256)
4. Chọn định dạng đầu ra (hex hoặc base64)
5. Nhấp 'Tạo HMAC'
6. Sao chép mã HMAC

Ví dụ:
Message: "user=john&action=login"
Key: "api_secret_key_123"
Algorithm: HMAC-SHA256
Output: Chuỗi hex 64 ký tự

Cùng message + key sẽ luôn tạo ra cùng HMAC.

HMAC được sử dụng cho gì?

HMAC được sử dụng rộng rãi cho xác thực an toàn và xác minh tính toàn vẹn:

✓ Xác thực API:
- Xác minh chữ ký AWS
- GitHub webhooks
- Ký API request
- Chữ ký OAuth

✓ JWT (JSON Web Tokens):
- Thuật toán HS256, HS384, HS512
- Xác minh chữ ký token

✓ Tính toàn vẹn Thông điệp:
- Xác minh webhook payload
- Phát hiện giả mạo dữ liệu
- Truyền thông điệp an toàn

HMAC đảm bảo cả tính xác thực (người gửi có key) và tính toàn vẹn (thông điệp không thay đổi).

Tôi nên sử dụng thuật toán HMAC nào?

Chọn dựa trên nhu cầu bảo mật của bạn:

HMAC-SHA256 (Khuyến nghị):
✓ Tiêu chuẩn công nghiệp
✓ Nhanh và an toàn
✓ Đầu ra hex 64 ký tự
✓ Được hầu hết APIs sử dụng
✓ JWT HS256

HMAC-SHA512 (An toàn hơn):
✓ Bảo mật tối đa
✓ Đầu ra hex 128 ký tự
✓ Tốt hơn cho dữ liệu giá trị cao
✓ JWT HS512

HMAC-SHA1 (Cũ):
⚠️ Không khuyến nghị cho dự án mới
✓ Chỉ cho tương thích cũ
✓ Đầu ra hex 40 ký tự

Đối với hầu hết ứng dụng: Dùng HMAC-SHA256

HMAC xác minh thông điệp như thế nào?

Quy trình xác minh HMAC:

1. Người gửi:
- Tạo thông điệp
- Tạo HMAC với secret key
- Gửi message + HMAC

2. Người nhận:
- Nhận message + HMAC
- Tạo HMAC từ message với cùng key
- So sánh HMAC đã tạo với HMAC nhận được
- Khớp = xác thực, không giả mạo
- Không khớp = từ chối (bị giả mạo hoặc key sai)

Nếu kẻ tấn công thay đổi message:
- HMAC mới sẽ không khớp
- Người nhận từ chối thông điệp

HMAC bảo vệ chống giả mạo và đảm bảo xác thực người gửi.

Tạo HMAC - Mã hóa HMAC — Tạo và xác minh chữ ký HMAC (SHA256/SHA512/SHA1/MD5). So sánh chữ ký webhook, ký request AWS và JWT HS256. Hex hoặc Base
Tạo HMAC - Mã hóa HMAC

Làm sao xác minh hoặc so sánh chữ ký HMAC trong công cụ này?

Dùng trường tùy chọn 'Chữ ký mong đợi'. (1) Dán thông điệp và đúng secret key bạn đã dùng để tạo chữ ký. (2) Chọn đúng thuật toán và định dạng đầu ra (hex hoặc base64). (3) Dán chữ ký bạn nhận được — ví dụ giá trị sau 'sha256=' trong header X-Hub-Signature-256 của GitHub, hoặc 'v1=' trong header Stripe-Signature — vào 'Chữ ký mong đợi'. (4) Nhấp Tạo HMAC. Công cụ tính HMAC và hiển thị kết quả rõ ràng KHỚP hoặc KHÔNG KHỚP.

So sánh có dung sai: hex được so sánh không phân biệt hoa thường và bỏ qua khoảng trắng, còn base64 được so sánh coi base64url (-_) giống chuẩn (+/) và bỏ qua phần đệm '=' ở cuối. Nhờ vậy bạn có thể dán chữ ký y như nó xuất hiện trong header.

Nếu nhận KHÔNG KHỚP, nguyên nhân thường gặp là: sai secret, byte thông điệp khác nhau (JSON re-serialize, \r\n vs \n, khoảng trắng cuối), sai thuật toán, hoặc dán hex trong khi đang so sánh ở chế độ base64. Lưu ý: xác minh trong trình duyệt này dùng để debug. Trong code production, luôn so sánh bằng hàm THỜI GIAN HẰNG SỐ (crypto.timingSafeEqual trong Node, hmac.compare_digest trong Python) để tránh timing attack.

JWT nói base64url nhưng công cụ này xuất base64 chuẩn — so sánh thế nào?

Chữ ký JWT (HS256/HS384/HS512) được mã hóa dạng base64url KHÔNG đệm: '+' thành '-', '/' thành '_', và bỏ các ký tự '=' cuối. Đầu ra Base64 của công cụ này là base64 CHUẨN (có + / và đệm =). Vì vậy cùng một byte HMAC có thể trông khác nhau ở dạng văn bản dù chúng giống hệt.

Hai cách an toàn để so sánh. (1) Dễ nhất: đổi định dạng đầu ra sang Hexadecimal ở cả hai phía — hex không có mơ hồ +//-_, nên chữ ký JWT giải mã sang hex luôn khớp. (2) Hoặc dùng chế độ xác minh ở đây: so sánh 'Chữ ký mong đợi' đã chuẩn hóa base64url về base64 chuẩn và bỏ qua đệm '=', nên bạn có thể dán đoạn chữ ký JWT thô thẳng vào 'Chữ ký mong đợi' với Base64 được chọn mà vẫn nhận KHỚP đúng.

Để tự dựng signing-input của JWT: HMAC trên base64url(header) + '.' + base64url(payload), rồi base64url-mã hóa kết quả (bỏ '='). Khi chữ ký không hợp lệ, đệm sai hoặc +/ vs -_ là lý do phổ biến nhất.

Làm sao xác minh chữ ký webhook Stripe / GitHub / Slack dùng HMAC?

Cả ba tuân cùng pattern với chi tiết khác nhau. Nhà cung cấp webhook POST payload JSON tới endpoint của bạn cùng header chứa chữ ký HMAC của chính payload đó, tính bằng secret chia sẻ bạn cấu hình lúc setup webhook. Việc của bạn: tính lại HMAC trên body nhận được và so với giá trị header dùng so sánh THỜI GIAN HẰNG SỐ (==, ===, strcmp rò rỉ thông tin timing; dùng crypto.timingSafeEqual trong Node hoặc hmac.compare_digest trong Python). Nếu khớp, request thực sự đến từ nhà cung cấp và không bị giả mạo trên đường; nếu không, từ chối với 401. (1) Stripe: header 'Stripe-Signature: t=1234567890,v1=abc...', secret bắt đầu bằng 'whsec_', thuật toán HMAC-SHA256, payload ký là timestamp + '.' + body. (2) GitHub: header 'X-Hub-Signature-256: sha256=abc...', secret bạn đặt cho từng repo, HMAC-SHA256 của body thô. (3) Slack: header 'X-Slack-Signature: v0=abc...', signing secret từ config app, HMAC-SHA256 của 'v0:' + timestamp + ':' + body. Luôn từ chối nếu timestamp cũ hơn 5 phút để ngăn replay attack.

Tại sao HMAC tính bằng Python không khớp với từ Node.js?

Tám trên mười lần là sai encoding — bạn đang hash các chuỗi byte khác nhau mà không nhận ra. Đi qua checklist này. (1) Encoding key: trong JavaScript 'Buffer.from(secret)' mặc định UTF-8 nhưng '.from(secret, 'hex')' diễn giải cùng chuỗi như byte hex. Nếu secret trông như '00ff42' có thể là giá trị hex 3 byte HOẶC chuỗi UTF-8 6 byte '00ff42'. (2) Encoding message: cùng vấn đề. Serialization JSON phải tạo đúng cùng byte ở cả hai phía — kể cả khác biệt thứ tự key ({a:1,b:2} vs {b:2,a:1}) cũng cho chữ ký khác. Hầu hết API yêu cầu bạn ký chuỗi byte JSON thô client gửi, không phải phiên bản re-serialize. (3) Encoding output: hex vs base64 vs base64 URL-safe khác nhau. (4) Newline: \n trên Linux/Mac nhưng \r\n trong body request từ client Windows; HMAC thấy chúng là byte khác. (5) Khoảng trắng: dấu cách cuối message. Giải pháp: in byte chính xác (Buffer.from(...).toString('hex')) ở cả hai phía cho message test nhỏ đã biết cho đến khi khớp, rồi chuyển sang payload thực.

Tôi có thể sử dụng HMAC cho mật khẩu không?

KHÔNG! HMAC KHÔNG dùng để băm mật khẩu.

HMAC:
✓ Xác thực thông điệp
✓ Chữ ký API
✓ Tính toàn vẹn dữ liệu
✗ KHÔNG lưu trữ mật khẩu

Để băm mật khẩu, sử dụng:
✓ bcrypt (khuyến nghị)
✓ Argon2 (hiện đại)
✓ PBKDF2 (chấp nhận được)

Tại sao?
- HMAC nhanh (không tốt cho mật khẩu)
- HMAC cần một key (mật khẩu là secret)
- HMAC không sử dụng salt đúng cách cho mật khẩu

HMAC và băm mật khẩu phục vụ mục đích khác nhau!

Tính năng chính

  • Tạo HMAC từ bất kỳ thông điệp nào ngay lập tức
  • Chế độ xác minh: so sánh với chữ ký mong đợi (KHỚP / KHÔNG KHỚP)
  • So sánh dung sai: hex không phân biệt hoa thường, base64url vs base64, bỏ qua đệm
  • Hỗ trợ SHA-256, SHA-512, SHA-1 và MD5 (đã kiểm chứng RFC 2104)
  • Định dạng đầu ra Hexadecimal hoặc Base64
  • Secret key với toggle hiện/ẩn
  • Web Crypto API để băm SHA (MD5 qua implementation trong trình duyệt)
  • Sao chép HMAC vào clipboard
  • Tải xuống HMAC dưới dạng file
  • Hiển thị thông tin thuật toán và đầu ra
  • Hỗ trợ chế độ tối
  • Xử lý 100% phía client
  • Hoạt động offline
  • Không cần đăng ký