Trình tạo HMAC

Tạo chữ ký HMAC với SHA-256, SHA-384 hoặc SHA-512

Thuật toán

Tin nhắn

Chạy cục bộ · An toàn để dán thông tin bí mật

Khoá bí mật

Chạy cục bộ · An toàn để dán thông tin bí mật

Chữ ký HMAC

Chữ ký HMAC sẽ xuất hiện ở đây…

HMAC là gì?

HMAC (Hash-based Message Authentication Code — Mã xác thực thông điệp dựa trên băm) là cấu trúc mật mã được định nghĩa trong RFC 2104, kết hợp hàm băm với khoá bí mật để tạo ra thẻ xác thực có kích thước cố định. Không giống như một giá trị băm thông thường mà bất kỳ ai cũng có thể tính toán, HMAC chỉ có thể được tạo ra và xác minh bởi các bên chia sẻ khoá bí mật. HMAC là cơ chế tiêu chuẩn để xác minh cả tính toàn vẹn và tính xác thực của thông điệp — xác nhận rằng dữ liệu chưa bị sửa đổi và được tạo ra bởi người gửi đáng tin cậy.

Thuật toán HMAC hoạt động với bất kỳ hàm băm lặp nào: SHA-256, SHA-384, SHA-512, và thậm chí các hàm cũ như SHA-1 hoặc MD5. Cấu trúc kết quả được gọi theo hàm băm cơ sở — HMAC-SHA256, HMAC-SHA384 hoặc HMAC-SHA512. Vì bằng chứng bảo mật của HMAC dựa vào hàm băm có khả năng kháng va chạm và các tính chất giả ngẫu nhiên nhất định, các thuật toán họ SHA-2 là lựa chọn được khuyến nghị cho các hệ thống mới. HMAC-SHA256 là biến thể được triển khai rộng rãi nhất, được dùng trong AWS Signature V4, Stripe webhooks, GitHub webhook secrets, Slack request signing và JSON Web Tokens (HS256).

Thiết kế của HMAC cung cấp một tính chất quan trọng mà băm thông thường thiếu: khả năng kháng các cuộc tấn công mở rộng độ dài. Với SHA-256 đơn thuần, kẻ tấn công biết H(message) có thể tính H(message || attacker_data) mà không cần biết thông điệp gốc. Cấu trúc băm kép của HMAC (băm bên trong và băm bên ngoài với các khoá đệm khác nhau) ngăn chặn hoàn toàn cuộc tấn công này. Đây là lý do tại sao các sơ đồ ký API sử dụng HMAC thay vì nối khoá bí mật vào thông điệp rồi băm kết quả.

Tại sao dùng trình tạo HMAC trực tuyến?

Thông thường, tính toán chữ ký HMAC đòi hỏi phải viết code hoặc dùng công cụ CLI. Trình tạo HMAC trên trình duyệt này cho phép bạn tạo chữ ký HMAC-SHA256, HMAC-SHA384 và HMAC-SHA512 ngay lập tức mà không cần cài đặt phần mềm hay chuyển sang terminal.

Tính toán HMAC tức thì
Nhập thông điệp và khoá bí mật của bạn, chọn thuật toán băm và nhận chữ ký HMAC ngay lập tức. Web Crypto API xử lý phép tính này trực tiếp trong trình duyệt.
🔒
Xử lý ưu tiên quyền riêng tư
Thông điệp và khoá bí mật của bạn không bao giờ rời khỏi thiết bị. Toàn bộ quá trình tính toán HMAC chạy cục bộ qua Web Crypto API — không gửi yêu cầu đến máy chủ, không ghi nhật ký, không lưu trữ dữ liệu.
📋
Hỗ trợ nhiều thuật toán
Chuyển đổi giữa HMAC-SHA256, HMAC-SHA384 và HMAC-SHA512 chỉ với một cú nhấp. So sánh đầu ra giữa các thuật toán để xác minh rằng triển khai backend của bạn cho kết quả khớp.
🔍
Không cần tài khoản hay cài đặt
Hoạt động trên mọi trình duyệt hiện đại — Chrome, Firefox, Safari, Edge. Không cần đăng ký, không cần tiện ích mở rộng, không cần thiết lập CLI. Mở trang và bắt đầu tạo chữ ký HMAC.

Các trường hợp sử dụng trình tạo HMAC

Lập trình viên Frontend — Xác minh chữ ký Webhook
Stripe, GitHub và Shopify ký payload webhook bằng HMAC-SHA256. Dùng công cụ này để tính chữ ký mong đợi từ payload và khoá bí mật, sau đó so sánh với chữ ký trong HTTP header trong quá trình phát triển.
Kỹ sư Backend — Ký yêu cầu API
AWS Signature V4 yêu cầu HMAC-SHA256 ở nhiều giai đoạn của quy trình ký. Tạo các giá trị HMAC tham chiếu trong quá trình phát triển để gỡ lỗi sự không khớp trong ký và xác minh các bước tính toán trung gian.
DevOps — Xác nhận xoay vòng khoá bí mật
Khi xoay vòng khoá bí mật webhook hoặc khoá ký API, tính chữ ký HMAC với cả khoá cũ lẫn khoá mới để xác nhận ứng dụng của bạn xử lý quá trình chuyển đổi đúng trước khi khoá cũ hết hạn.
Kỹ sư QA — Vector kiểm tra chữ ký
Tạo các vector kiểm tra HMAC với đầu vào và khoá đã biết để xây dựng bài kiểm tra hồi quy cho middleware xác thực. Xác minh rằng triển khai của bạn xử lý đúng thông điệp rỗng, đầu vào Unicode và khoá dài.
Kỹ sư Dữ liệu — Xác thực thông điệp trong pipeline
Gắn chữ ký HMAC vào các thông điệp trong pipeline hướng sự kiện (Kafka, SQS) để xác minh rằng thông điệp chưa bị giả mạo trong quá trình truyền giữa các dịch vụ.
Sinh viên — Bài tập mật mã học
Thực nghiệm với HMAC để hiểu cách thay đổi một ký tự trong thông điệp hoặc khoá tạo ra chữ ký hoàn toàn khác. So sánh đầu ra HMAC với đầu ra SHA-256 thông thường để quan sát sự khác biệt mà khoá bí mật tạo ra.

HMAC so với băm thông thường và mã hóa

HMAC, băm thông thường và mã hóa phục vụ các mục đích khác nhau. HMAC cung cấp xác thực thông điệp — bằng chứng rằng thông điệp được tạo ra bởi người nắm khoá bí mật và chưa bị sửa đổi. Băm thông thường cung cấp tính toàn vẹn nhưng không xác thực. Mã hóa cung cấp tính bảo mật. Bảng dưới đây làm rõ sự khác biệt.

Thuộc tínhHMACPlain HashEncryption
PurposeMessage authentication + integrityData integrity only (no key)Confidentiality + integrity
Requires secret keyYesNoYes
Verifiable byParties who share the secretAnyoneRecipient with key
ReversibleNo — digest onlyNo — digest onlyYes — decryption recovers data
Output sizeDepends on hash (e.g. 256 bits)Depends on hashVariable (ciphertext)
StandardRFC 2104FIPS 180-4NIST SP 800-38A (AES)
Use case exampleWebhook signature verificationFile checksum verificationEncrypting data at rest

So sánh các thuật toán HMAC

HMAC có thể dùng bất kỳ hàm băm nào, nhưng lựa chọn thuật toán cơ sở quyết định kích thước đầu ra, mức độ bảo mật và khả năng tương thích trình duyệt. HMAC-SHA256 là lựa chọn phổ biến nhất cho các hệ thống mới. Bảng dưới đây so sánh các biến thể bạn có khả năng gặp.

Thuật toánKích thước DigestĐộ dài HexWeb Crypto APIPhù hợp nhất cho
HMAC-SHA256256 bits64 hex charsYesAPI signing, webhooks, JWT (HS256)
HMAC-SHA384384 bits96 hex charsYesTLS 1.3 PRF, CNSA compliance
HMAC-SHA512512 bits128 hex charsYesHigh-security signatures, HKDF
HMAC-SHA1160 bits40 hex charsYesLegacy OAuth 1.0, TOTP (RFC 6238)
HMAC-MD5128 bits32 hex charsNoLegacy only — not recommended

HMAC hoạt động bên trong như thế nào?

HMAC áp dụng hàm băm cơ sở hai lần với hai pad dẫn xuất từ khoá khác nhau. Cấu trúc được định nghĩa trong RFC 2104 và được chứng minh là PRF (hàm giả ngẫu nhiên) dưới các giả định mật mã tiêu chuẩn. Khoá trước tiên được đệm hoặc băm để khớp với kích thước khối của hàm băm (64 byte với SHA-256, 128 byte với SHA-512).

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
where K' = key padded to block size, ipad = 0x36, opad = 0x5C

Thuật toán XOR khoá đã đệm với hằng số pad bên trong (ipad, 0x36 lặp lại), nối với thông điệp và băm kết quả. Sau đó XOR khoá đã đệm với hằng số pad bên ngoài (opad, 0x5C lặp lại), nối với đầu ra băm bên trong và băm lần nữa. Cấu trúc băm kép này là thứ ngăn chặn các cuộc tấn công mở rộng độ dài và đảm bảo rằng đầu ra HMAC không thể tính được nếu không biết khoá bí mật.

Ví dụ code HMAC

HMAC được hỗ trợ nguyên bản trong mọi ngôn ngữ và môi trường thực thi lớn. Web Crypto API cung cấp HMAC-SHA256, HMAC-SHA384 và HMAC-SHA512 trong trình duyệt mà không cần thư viện nào. Các ví dụ dưới đây minh họa các mẫu sử dụng thực tế bao gồm xác minh webhook và so sánh theo thời gian hằng định.

JavaScript (Web Crypto API)
async function hmacSHA256(message, secret) {
  const enc = new TextEncoder()
  const key = await crypto.subtle.importKey(
    'raw', enc.encode(secret),
    { name: 'HMAC', hash: 'SHA-256' },
    false, ['sign']
  )
  const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
  return Array.from(new Uint8Array(sig))
    .map(b => b.toString(16).padStart(2, '0')).join('')
}

await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
  .update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
Python
import hmac
import hashlib

# HMAC-SHA256
sig = hmac.new(
    b'my-secret-key',
    b'hello world',
    hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"

# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
    print("Signature valid")

# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()
Go
package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "fmt"
)

func main() {
    mac := hmac.New(sha256.New, []byte("my-secret-key"))
    mac.Write([]byte("hello world"))
    sig := mac.Sum(nil)
    fmt.Printf("%x\n", sig)
    // → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

    // Verify: use hmac.Equal for constant-time comparison
    expected := mac.Sum(nil)
    fmt.Println(hmac.Equal(sig, expected)) // true
}
CLI (OpenSSL)
# HMAC-SHA256
echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key"
# → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad

# HMAC-SHA512
echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key"

# Verify a file signature
openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz

# HMAC with hex key (e.g. from a webhook secret)
echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"

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

Sự khác biệt giữa HMAC và băm thông thường là gì?
Băm thông thường (SHA-256, MD5) chỉ nhận thông điệp làm đầu vào và tạo ra digest mà bất kỳ ai cũng có thể tính toán. HMAC nhận cả thông điệp lẫn khoá bí mật, tạo ra chữ ký mà chỉ người nắm khoá mới có thể tạo hoặc xác minh. Điều này có nghĩa HMAC cung cấp xác thực (bằng chứng về danh tính người gửi) ngoài việc kiểm tra tính toàn vẹn. Băm thông thường chỉ chứng minh dữ liệu chưa thay đổi, không chứng minh ai đã tạo ra nó.
HMAC-SHA256 có bảo mật không?
Có. HMAC-SHA256 được coi là bảo mật tính đến năm 2026. Bảo mật của nó dựa vào các tính chất giả ngẫu nhiên của SHA-256 và cấu trúc HMAC (RFC 2104). Chưa có cuộc tấn công thực tế nào chống lại HMAC-SHA256 được chứng minh. Thậm chí HMAC-MD5 và HMAC-SHA1 vẫn bảo mật trong thực tế vì bảo mật của HMAC không đòi hỏi khả năng kháng va chạm đầy đủ của hàm băm cơ sở, dù các biến thể SHA-2 được khuyến nghị cho các hệ thống mới.
Tại sao webhook dùng HMAC thay vì mã hóa payload?
Payload webhook thường chứa dữ liệu mà bên nhận đã biết trước — chi tiết đơn hàng, thông báo sự kiện, cập nhật trạng thái. Mục tiêu không phải là che giấu dữ liệu (tính bảo mật) mà là chứng minh nó đến từ người gửi hợp lệ và không bị sửa đổi trong quá trình truyền (tính xác thực và toàn vẹn). HMAC đạt được điều này với chi phí tối thiểu: người gửi tính HMAC của payload với khoá bí mật dùng chung và đưa vào HTTP header. Bên nhận tính lại HMAC và so sánh. Mã hóa sẽ thêm sự phức tạp và gánh nặng quản lý khoá không cần thiết.
Làm thế nào để so sánh chữ ký HMAC một cách bảo mật?
Luôn dùng hàm so sánh theo thời gian hằng định. Trong Python, dùng hmac.compare_digest(). Trong Node.js, dùng crypto.timingSafeEqual(). Trong Go, dùng hmac.Equal(). Các toán tử so sánh chuỗi thông thường (== hoặc ===) có thể rò rỉ thông tin thời gian: kẻ tấn công có thể đo thời gian so sánh để xác định bao nhiêu byte của chữ ký giả mạo khớp với chữ ký đúng, rồi brute-force các byte còn lại từng byte một.
HMAC có thể bị đảo ngược để khôi phục khoá bí mật không?
Không. HMAC dựa trên hàm băm một chiều, vì vậy không có phím tắt toán học nào để trích xuất khoá từ đầu ra HMAC. Kẻ tấn công cần brute-force toàn bộ không gian khoá, điều này không khả thi với khoá 128 bit hoặc dài hơn. Tuy nhiên, khoá yếu hoặc ngắn (như mật khẩu đơn giản) có thể dễ bị tấn công từ điển, vì vậy hãy luôn dùng khoá ngẫu nhiên có độ dài ít nhất 256 bit cho HMAC-SHA256.
Điều gì xảy ra nếu khoá HMAC dài hơn kích thước khối băm?
Nếu khoá bí mật dài hơn kích thước khối của hàm băm (64 byte với SHA-256, 128 byte với SHA-512), thuật toán HMAC trước tiên băm khoá bằng hàm băm cơ sở để rút gọn xuống độ dài đầu ra băm, rồi dùng giá trị băm đó làm khoá hiệu dụng. Điều này có nghĩa là khoá rất dài không cung cấp thêm bảo mật ngoài kích thước đầu ra băm. Với HMAC-SHA256, khoá dài hơn 64 byte sẽ được băm xuống còn 32 byte và không cải thiện bảo mật so với khoá 64 byte; khoá đến 64 byte được dùng với toàn bộ độ dài.
Khi nào nên dùng HMAC-SHA512 thay vì HMAC-SHA256?
Dùng HMAC-SHA512 khi giao thức yêu cầu (một số hàm dẫn xuất khoá như HKDF-SHA512, tạo khoá Ed25519), khi cần chữ ký rộng hơn để tăng cường phòng thủ theo chiều sâu, hoặc khi chạy trên phần cứng 64-bit nơi SHA-512 thực sự nhanh hơn SHA-256. Với hầu hết ứng dụng web, ký API và xác minh webhook, HMAC-SHA256 cung cấp đủ bảo mật và là lựa chọn phổ biến hơn trong các hệ sinh thái.