ToolDeck

تولیدکننده 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 را بلافاصله دریافت کنید. Web Crypto API محاسبه را به صورت بومی در مرورگر شما انجام می‌دهد.
🔒
پردازش با اولویت حریم خصوصی
پیام و کلید مخفی شما هرگز دستگاهتان را ترک نمی‌کنند. تمام محاسبات HMAC به صورت محلی از طریق Web Crypto API اجرا می‌شود — بدون درخواست به سرور، بدون ثبت، بدون نگهداری داده.
📋
پشتیبانی از چند الگوریتم
با یک کلیک بین HMAC-SHA256، HMAC-SHA384 و HMAC-SHA512 جابجا شوید. خروجی‌ها را در الگوریتم‌های مختلف مقایسه کنید تا تأیید کنید پیاده‌سازی بک‌اند شما مطابقت دارد.
🔍
بدون حساب کاربری یا نصب
در هر مرورگر مدرن کار می‌کند — Chrome، Firefox، Safari، Edge. بدون ثبت‌نام، بدون افزونه، بدون راه‌اندازی CLI. صفحه را باز کنید و شروع به تولید امضاهای HMAC کنید.

موارد استفاده از تولیدکننده HMAC

توسعه‌دهنده فرانت‌اند — تأیید امضای وب‌هوک
Stripe، GitHub و Shopify payloadهای وب‌هوک را با HMAC-SHA256 امضا می‌کنند. از این ابزار برای محاسبه امضای مورد انتظار از یک payload و کلید مخفی استفاده کنید، سپس آن را در حین توسعه با امضای موجود در هدر HTTP مقایسه کنید.
مهندس بک‌اند — امضای درخواست API
AWS Signature V4 در چندین مرحله از فرآیند امضا به HMAC-SHA256 نیاز دارد. مقادیر مرجع HMAC را در حین توسعه تولید کنید تا عدم تطابق‌های امضا را اشکال‌زدایی کرده و مراحل محاسبه میانی را تأیید کنید.
DevOps — اعتبارسنجی چرخش کلید مخفی
هنگام چرخش کلیدهای مخفی وب‌هوک یا کلیدهای امضای API، امضاهای HMAC را با هر دو کلید قدیمی و جدید محاسبه کنید تا تأیید کنید برنامه شما قبل از انقضای کلید قدیمی، انتقال را به درستی مدیریت می‌کند.
مهندس QA — بردارهای آزمون امضا
بردارهای آزمون HMAC را با ورودی‌ها و کلیدهای شناخته‌شده تولید کنید تا آزمون‌های رگرسیون برای میان‌افزار احراز هویت خود بسازید. تأیید کنید که پیاده‌سازی شما پیام‌های خالی، ورودی Unicode و کلیدهای بلند را به درستی مدیریت می‌کند.
مهندس داده — احراز هویت پیام در خط لوله
امضاهای HMAC را به پیام‌ها در خطوط لوله رویداد-محور (Kafka، SQS) ضمیمه کنید تا تأیید کنید پیام‌ها در حین انتقال بین سرویس‌ها دستکاری نشده‌اند.
دانشجو — درس‌های رمزنگاری
با HMAC آزمایش کنید تا بفهمید چگونه تغییر یک کاراکتر در پیام یا کلید، امضایی کاملاً متفاوت تولید می‌کند. خروجی HMAC را با خروجی SHA-256 ساده مقایسه کنید تا تفاوتی که یک کلید مخفی ایجاد می‌کند را مشاهده کنید.

HMAC در برابر هش ساده در برابر رمزنگاری

HMAC، هش ساده و رمزنگاری اهداف متفاوتی دارند. HMAC احراز هویت پیام را فراهم می‌کند — اثبات اینکه پیام توسط کسی با کلید مخفی ایجاد شده و تغییر نکرده است. یک هش ساده یکپارچگی را فراهم می‌کند اما احراز هویت را نه. رمزنگاری محرمانگی را فراهم می‌کند. جدول زیر تمایزات را روشن می‌کند.

ویژگیHMACPlain 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

مقایسه الگوریتم‌های HMAC

HMAC می‌تواند از هر تابع هشی استفاده کند، اما انتخاب الگوریتم زیرین، اندازه خروجی، سطح امنیت و سازگاری با مرورگر را تعیین می‌کند. HMAC-SHA256 رایج‌ترین انتخاب برای سیستم‌های جدید است. جدول زیر انواعی که احتمالاً با آن‌ها مواجه خواهید شد را مقایسه می‌کند.

الگوریتماندازه Digestطول هگزوب کریپتوبهترین کاربرد
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

HMAC تابع هش زیرین را دو بار با دو pad مشتق‌شده از کلید متفاوت اعمال می‌کند. این ساختار در RFC 2104 تعریف شده و اثبات شده که تحت فرضیات رمزنگاری استاندارد یک PRF (تابع شبه‌تصادفی) است. کلید ابتدا برای تطابق با اندازه بلوک تابع هش (۶۴ بایت برای SHA-256، ۱۲۸ بایت برای SHA-512) پد می‌شود یا هش می‌شود.

HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
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 را فراهم می‌کند. نمونه‌های زیر الگوهای استفاده واقعی شامل تأیید وب‌هوک و مقایسه زمان ثابت را نشان می‌دهند.

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)"

سؤالات متداول

تفاوت بین HMAC و هش ساده چیست؟
یک هش ساده (SHA-256، MD5) فقط یک پیام را به عنوان ورودی می‌گیرد و یک digest تولید می‌کند که هر کسی می‌تواند آن را محاسبه کند. HMAC هم پیام و هم یک کلید مخفی می‌گیرد و امضایی تولید می‌کند که تنها کسی با کلید می‌تواند آن را تولید یا تأیید کند. این به این معنی است که HMAC علاوه بر بررسی یکپارچگی، احراز هویت (اثبات هویت فرستنده) هم فراهم می‌کند. یک هش ساده فقط ثابت می‌کند داده تغییر نکرده، نه اینکه چه کسی آن را تولید کرده است.
آیا HMAC-SHA256 امن است؟
بله. HMAC-SHA256 تا سال ۲۰۲۶ امن در نظر گرفته می‌شود. امنیت آن به ویژگی‌های شبه‌تصادفی SHA-256 و خود ساختار HMAC (RFC 2104) متکی است. هیچ حمله عملی علیه HMAC-SHA256 نشان داده نشده است. حتی HMAC-MD5 و HMAC-SHA1 در عمل امن باقی می‌مانند زیرا امنیت HMAC به مقاومت کامل در برابر collision هش زیرین نیاز ندارد، هرچند انواع SHA-2 برای سیستم‌های جدید توصیه می‌شوند.
چرا وب‌هوک‌ها از HMAC به جای رمزنگاری payload استفاده می‌کنند؟
payloadهای وب‌هوک معمولاً حاوی داده‌هایی هستند که گیرنده از قبل انتظار آن‌ها را دارد — جزئیات سفارش، اعلان‌های رویداد، به‌روزرسانی‌های وضعیت. هدف پنهان کردن داده‌ها (محرمانگی) نیست، بلکه اثبات این است که از فرستنده قانونی آمده و در حین انتقال تغییر نکرده است (اصالت و یکپارچگی). HMAC این را با سربار حداقلی انجام می‌دهد: فرستنده یک HMAC از payload با یک کلید مخفی مشترک محاسبه کرده و آن را در یک هدر HTTP قرار می‌دهد. گیرنده HMAC را مجدداً محاسبه کرده و مقایسه می‌کند. رمزنگاری پیچیدگی غیرضروری و بار مدیریت کلید اضافه می‌کرد.
چگونه باید امضاهای HMAC را به صورت امن مقایسه کنم؟
همیشه از یک تابع مقایسه با زمان ثابت استفاده کنید. در Python از hmac.compare_digest() استفاده کنید. در Node.js از crypto.timingSafeEqual() استفاده کنید. در Go از hmac.Equal() استفاده کنید. عملگرهای مقایسه رشته استاندارد (== یا ===) می‌توانند اطلاعات زمان‌بندی درز کنند: یک مهاجم می‌تواند اندازه‌گیری کند مقایسه چقدر طول می‌کشد تا تعیین کند چه تعداد بایت از امضای جعلی‌اش با بایت صحیح مطابقت دارند، سپس بایت‌های باقیمانده را یکی‌یکی brute-force کنند.
آیا می‌توان HMAC را برای بازیابی کلید مخفی معکوس کرد؟
خیر. HMAC بر اساس یک تابع هش یک‌طرفه است، بنابراین هیچ میانبر ریاضی برای استخراج کلید از خروجی HMAC وجود ندارد. یک مهاجم باید فضای کلید را brute-force کند که برای کلیدهای ۱۲۸ بیت یا بیشتر غیرعملی است. با این حال، کلیدهای ضعیف یا کوتاه (مانند رمزهای عبور ساده) می‌توانند در برابر حملات dictionary آسیب‌پذیر باشند، بنابراین همیشه از کلیدهای تصادفی رمزنگاری با حداقل ۲۵۶ بیت برای HMAC-SHA256 استفاده کنید.
اگر کلید HMAC از اندازه بلوک هش بزرگ‌تر باشد چه اتفاقی می‌افتد؟
اگر کلید مخفی از اندازه بلوک تابع هش بزرگ‌تر باشد (۶۴ بایت برای SHA-256، ۱۲۸ بایت برای SHA-512)، الگوریتم HMAC ابتدا کلید را با تابع هش زیرین هش می‌کند تا آن را به طول خروجی هش کاهش دهد، سپس از آن هش به عنوان کلید مؤثر استفاده می‌کند. این به این معنی است که کلیدهای بسیار بلند امنیت اضافه‌ای فراتر از اندازه خروجی هش فراهم نمی‌کنند. برای HMAC-SHA256، کلیدهای بلندتر از ۶۴ بایت به ۳۲ بایت هش می‌شوند و هیچ بهبود امنیتی نسبت به یک کلید ۶۴ بایتی ارائه نمی‌دهند؛ کلیدهای تا ۶۴ بایت با طول کامل خود استفاده می‌شوند.
چه زمانی باید از HMAC-SHA512 به جای HMAC-SHA256 استفاده کنم؟
از HMAC-SHA512 استفاده کنید وقتی پروتکل آن را الزامی می‌کند (برخی توابع استخراج کلید مانند HKDF-SHA512، تولید کلید Ed25519)، وقتی به امضایی گسترده‌تر برای دفاع لایه‌به‌لایه نیاز دارید، یا وقتی روی سخت‌افزار ۶۴ بیتی اجرا می‌کنید که SHA-512 در آن واقعاً سریع‌تر از SHA-256 است. برای اکثر برنامه‌های وب، امضای API و تأیید وب‌هوک، HMAC-SHA256 امنیت کافی فراهم می‌کند و در اکوسیستم‌ها گزینه رایج‌تر است.