HMAC คืออะไร?
HMAC (Hash-based Message Authentication Code) คือโครงสร้างเข้ารหัสที่กำหนดใน RFC 2104 ซึ่งรวมฟังก์ชันแฮชเข้ากับกุญแจลับเพื่อสร้างแท็กยืนยันตัวตนขนาดคงที่ ต่างจากแฮชธรรมดาที่ใครก็คำนวณได้ HMAC สามารถสร้างและตรวจสอบได้เฉพาะผู้ที่ถือกุญแจลับร่วมกันเท่านั้น HMAC คือกลไกมาตรฐานสำหรับตรวจสอบทั้งความสมบูรณ์และความถูกต้องของข้อความ — ยืนยันว่าข้อมูลไม่ถูกแก้ไข และมาจากผู้ส่งที่น่าเชื่อถือ
อัลกอริทึม HMAC ทำงานร่วมกับฟังก์ชันแฮชแบบวนซ้ำใดก็ได้: SHA-256, SHA-384, SHA-512 และแม้แต่ฟังก์ชันเดิมอย่าง SHA-1 หรือ MD5 โครงสร้างที่ได้เรียกตามแฮชพื้นฐาน เช่น HMAC-SHA256, HMAC-SHA384 หรือ HMAC-SHA512 เนื่องจากความปลอดภัยของ HMAC ขึ้นอยู่กับความต้านทาน collision ของฟังก์ชันแฮชและคุณสมบัติ pseudorandom บางประการ อัลกอริทึมในตระกูล SHA-2 จึงเป็นตัวเลือกที่แนะนำสำหรับระบบใหม่ HMAC-SHA256 เป็นตัวแปรที่ใช้งานกว้างขวางที่สุด ครอบคลุม AWS Signature V4, Stripe webhooks, GitHub webhook secrets, Slack request signing และ JSON Web Tokens (HS256)
การออกแบบของ HMAC มอบคุณสมบัติสำคัญที่แฮชธรรมดาไม่มี: ความต้านทานต่อ length-extension attack ด้วย SHA-256 เพียงอย่างเดียว ผู้โจมตีที่รู้ H(message) สามารถคำนวณ H(message || attacker_data) ได้โดยไม่รู้ข้อความต้นฉบับ โครงสร้าง double-hashing ของ HMAC (inner hash และ outer hash ด้วย padded key ต่างกัน) ป้องกันการโจมตีนี้ได้อย่างสมบูรณ์ นี่คือเหตุผลที่ scheme ลายเซ็น API ใช้ HMAC แทนการต่อกุญแจลับกับข้อความแล้วแฮชผลลัพธ์
RFC 2104 — HMAC: Keyed-Hashing for Message Authentication →
ทำไมต้องใช้เครื่องสร้าง HMAC ออนไลน์?
การคำนวณลายเซ็น HMAC โดยปกติต้องเขียนโค้ดหรือใช้เครื่องมือ CLI เครื่องสร้าง HMAC บนเบราว์เซอร์นี้ช่วยให้คุณสร้างลายเซ็น HMAC-SHA256, HMAC-SHA384 และ HMAC-SHA512 ได้ทันทีโดยไม่ต้องติดตั้งซอฟต์แวร์หรือเปิด terminal
กรณีการใช้งานเครื่องสร้าง HMAC
HMAC กับแฮชธรรมดา กับการเข้ารหัส
HMAC แฮชธรรมดา และการเข้ารหัสมีวัตถุประสงค์ต่างกัน HMAC มอบการยืนยันตัวตนของข้อความ — หลักฐานว่าข้อความถูกสร้างโดยผู้ที่มีกุญแจลับและไม่ถูกแก้ไข แฮชธรรมดามอบความสมบูรณ์แต่ไม่มีการยืนยันตัวตน การเข้ารหัสมอบการรักษาความลับ ตารางด้านล่างชี้แจงความแตกต่าง
| คุณสมบัติ | HMAC | Plain Hash | Encryption |
|---|---|---|---|
| Purpose | Message authentication + integrity | Data integrity only (no key) | Confidentiality + integrity |
| Requires secret key | Yes | No | Yes |
| Verifiable by | Parties who share the secret | Anyone | Recipient with key |
| Reversible | No — digest only | No — digest only | Yes — decryption recovers data |
| Output size | Depends on hash (e.g. 256 bits) | Depends on hash | Variable (ciphertext) |
| Standard | RFC 2104 | FIPS 180-4 | NIST SP 800-38A (AES) |
| Use case example | Webhook signature verification | File checksum verification | Encrypting data at rest |
การเปรียบเทียบอัลกอริทึม HMAC
HMAC ใช้ได้กับฟังก์ชันแฮชใดก็ได้ แต่การเลือกอัลกอริทึมพื้นฐานกำหนดขนาดผลลัพธ์ ระดับความปลอดภัย และความเข้ากันได้กับเบราว์เซอร์ HMAC-SHA256 เป็นตัวเลือกที่พบบ่อยที่สุดสำหรับระบบใหม่ ตารางด้านล่างเปรียบเทียบตัวแปรที่คุณน่าจะพบ
| อัลกอริทึม | ขนาด Digest | ความยาว Hex | เว็บ คริปโต | เหมาะสำหรับ |
|---|---|---|---|---|
| HMAC-SHA256 | 256 bits | 64 hex chars | Yes | API signing, webhooks, JWT (HS256) |
| HMAC-SHA384 | 384 bits | 96 hex chars | Yes | TLS 1.3 PRF, CNSA compliance |
| HMAC-SHA512 | 512 bits | 128 hex chars | Yes | High-security signatures, HKDF |
| HMAC-SHA1 | 160 bits | 40 hex chars | Yes | Legacy OAuth 1.0, TOTP (RFC 6238) |
| HMAC-MD5 | 128 bits | 32 hex chars | No | Legacy only — not recommended |
HMAC ทำงานภายในอย่างไร?
HMAC ใช้ฟังก์ชันแฮชพื้นฐานสองครั้งด้วย pad ที่ได้จากกุญแจสองแบบที่ต่างกัน โครงสร้างนี้กำหนดใน RFC 2104 และพิสูจน์แล้วว่าเป็น PRF (pseudorandom function) ภายใต้สมมติฐานเข้ารหัสมาตรฐาน กุญแจถูก pad หรือแฮชก่อนเพื่อให้ตรงกับขนาดบล็อกของฟังก์ชันแฮช (64 ไบต์สำหรับ SHA-256, 128 ไบต์สำหรับ SHA-512)
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
อัลกอริทึม XOR กุญแจที่ pad แล้วกับค่าคงที่ inner pad (ipad, 0x36 ซ้ำ) ต่อกับข้อความ แล้วแฮชผลลัพธ์ จากนั้น XOR กุญแจที่ pad แล้วกับค่าคงที่ outer pad (opad, 0x5C ซ้ำ) ต่อกับผลลัพธ์ inner hash แล้วแฮชอีกครั้ง โครงสร้าง double-hashing นี้คือสิ่งที่ป้องกัน length-extension attack และรับประกันว่าผลลัพธ์ HMAC ไม่สามารถคำนวณได้โดยไม่รู้กุญแจลับ
ตัวอย่างโค้ด HMAC
HMAC ได้รับการรองรับโดยตรงในทุกภาษาและ runtime หลัก Web Crypto API มี HMAC-SHA256, HMAC-SHA384 และ HMAC-SHA512 ในเบราว์เซอร์โดยไม่ต้องใช้ไลบรารี ตัวอย่างด้านล่างแสดงรูปแบบการใช้งานจริง รวมถึงการตรวจสอบ webhook และการเปรียบเทียบแบบ constant-time
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"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()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
}# 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)"