เครื่องสร้าง HMAC
สร้างลายเซ็น HMAC ด้วย SHA-256 SHA-384 หรือ SHA-512
ข้อความ
กุญแจลับ
ลายเซ็น HMAC
ลายเซ็น HMAC จะแสดงที่นี่…
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 แทนการต่อกุญแจลับกับข้อความแล้วแฮชผลลัพธ์
ทำไมต้องใช้เครื่องสร้าง 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)"