تولیدکننده HMAC
تولید امضاهای HMAC با SHA-256، SHA-384 یا SHA-512
پیام
کلید مخفی
امضای HMAC
امضای HMAC اینجا نمایش داده میشود…
HMAC چیست؟
HMAC (کد احراز هویت پیام مبتنی بر هش) یک ساختار رمزنگاری است که در RFC 2104 تعریف شده و یک تابع هش را با یک کلید مخفی ترکیب میکند تا یک برچسب احراز هویت با اندازه ثابت تولید کند. بر خلاف هش ساده که هر کسی میتواند آن را محاسبه کند، یک HMAC تنها توسط طرفهایی که کلید مخفی را به اشتراک میگذارند قابل تولید و تأیید است. HMAC مکانیزم استاندارد برای تأیید هم یکپارچگی و هم اصالت یک پیام است — تأیید اینکه داده تغییر نکرده و توسط فرستندهای معتمد تولید شده است.
الگوریتم HMAC با هر تابع هش تکراری کار میکند: SHA-256، SHA-384، SHA-512، و حتی توابع قدیمیتر مانند SHA-1 یا MD5. ساختار حاصل با نام هش زیرین خود شناخته میشود — HMAC-SHA256، HMAC-SHA384 یا HMAC-SHA512. از آنجا که اثبات امنیتی HMAC به مقاومت تابع هش در برابر collision و داشتن برخی ویژگیهای شبهتصادفی بستگی دارد، الگوریتمهای خانواده SHA-2 گزینه پیشنهادی برای سیستمهای جدید هستند. HMAC-SHA256 پرکاربردترین نوع است که در AWS Signature V4، وبهوکهای Stripe، رازهای وبهوک GitHub، امضای درخواست Slack و JSON Web Tokens (HS256) استفاده میشود.
طراحی HMAC یک ویژگی حیاتی را فراهم میکند که هش ساده فاقد آن است: مقاومت در برابر حملات length-extension. با SHA-256 تنها، مهاجمی که H(message) را میداند میتواند H(message || attacker_data) را بدون دانستن پیام اصلی محاسبه کند. ساختار دوبار-هشکردن HMAC (هش داخلی و هش خارجی با کلیدهای پدشده متفاوت) این حمله را کاملاً خنثی میکند. به همین دلیل است که طرحهای امضای API از HMAC استفاده میکنند نه از الحاق کلید مخفی به پیام و هش کردن نتیجه.
چرا از تولیدکننده آنلاین HMAC استفاده کنیم؟
محاسبه امضاهای HMAC معمولاً نیاز به نوشتن کد یا استفاده از ابزارهای CLI دارد. این تولیدکننده HMAC مبتنی بر مرورگر به شما امکان میدهد امضاهای HMAC-SHA256، HMAC-SHA384 و HMAC-SHA512 را فوراً و بدون نصب نرمافزار یا تغییر محیط ایجاد کنید.
موارد استفاده از تولیدکننده 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 | طول هگز | وب کریپتو | بهترین کاربرد |
|---|---|---|---|---|
| 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 (تابع شبهتصادفی) است. کلید ابتدا برای تطابق با اندازه بلوک تابع هش (۶۴ بایت برای SHA-256، ۱۲۸ بایت برای SHA-512) پد میشود یا هش میشود.
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
الگوریتم کلید پدشده را با یک ثابت pad داخلی (ipad، 0x36 تکرارشده) XOR میکند، آن را با پیام الحاق میدهد و نتیجه را هش میکند. سپس کلید پدشده را با یک ثابت pad خارجی (opad، 0x5C تکرارشده) XOR میکند، آن را با خروجی هش داخلی الحاق میدهد و دوباره هش میکند. این ساختار دوبار-هشکردن است که از حملات length-extension جلوگیری میکند و تضمین میکند خروجی HMAC بدون دانستن کلید مخفی قابل محاسبه نیست.
نمونه کدهای HMAC
HMAC به صورت بومی در تمام زبانها و runtime های اصلی پشتیبانی میشود. Web Crypto API در مرورگرها بدون هیچ کتابخانهای HMAC-SHA256، HMAC-SHA384 و HMAC-SHA512 را فراهم میکند. نمونههای زیر الگوهای استفاده واقعی شامل تأیید وبهوک و مقایسه زمان ثابت را نشان میدهند.
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)"