مولّد 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 على مقاومة دالة التجزئة للتصادم وعلى خصائص شبه العشوائية، تُعدّ خوارزميات عائلة SHA-2 الخيار الموصى به للأنظمة الجديدة. وHMAC-SHA256 هو المتغير الأوسع انتشاراً، المستخدَم في AWS Signature V4 وStripe webhooks وأسرار GitHub webhook وتوقيع طلبات Slack وJSON Web Tokens (HS256).

يوفر تصميم HMAC خاصية أساسية تفتقر إليها التجزئة العادية: المقاومة لهجمات تمديد الطول. مع SHA-256 وحدها، يستطيع مهاجم يعلم H(message) حساب H(message || attacker_data) دون معرفة الرسالة الأصلية. يحول بناء HMAC المزدوج للتجزئة (تجزئة داخلية وتجزئة خارجية بمفاتيح مبطَّنة مختلفة) دون هذا الهجوم كلياً. ولهذا السبب تستخدم مخططات توقيع الواجهات البرمجية HMAC بدلاً من إلحاق مفتاح سري بالرسالة وتجزئة الناتج.

لماذا تستخدم مولّد HMAC هذا؟

يستلزم إنشاء توقيعات HMAC عادةً كتابة كود أو استخدام أدوات سطر الأوامر. يتيح لك مولّد 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. لا تسجيل ولا إضافات ولا إعداد لسطر الأوامر. افتح الصفحة وابدأ بإنشاء توقيعات HMAC.

حالات استخدام مولّد HMAC

مطوّر الواجهة الأمامية — التحقق من توقيع Webhook
تُوقِّع Stripe وGitHub وShopify حمولات webhook بـ HMAC-SHA256. استخدم هذه الأداة لحساب التوقيع المتوقع من حمولة وسر، ثم قارنه بالتوقيع في رأس HTTP أثناء التطوير.
مهندس الخلفية — توقيع طلبات الواجهة البرمجية
يتطلب AWS Signature V4 خوارزمية HMAC-SHA256 في مراحل متعددة من عملية التوقيع. أنشئ قيم HMAC مرجعية أثناء التطوير لتصحيح أخطاء عدم تطابق التوقيع والتحقق من خطوات الحساب الوسيطة.
DevOps — التحقق من تدوير الأسرار
عند تدوير أسرار webhook أو مفاتيح توقيع الواجهة البرمجية، احسب توقيعات HMAC بالمفتاح القديم والجديد معاً للتأكد من أن تطبيقك يتعامل مع الانتقال بشكل صحيح قبل انتهاء صلاحية المفتاح القديم.
مهندس ضمان الجودة — متجهات اختبار التوقيع
أنشئ متجهات اختبار 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 هو الخيار الأشيع للأنظمة الجديدة. يقارن الجدول أدناه المتغيرات التي من المرجح مصادفتها.

الخوارزميةحجم الملخصطول السداسي العشريويب كريبتوالأنسب لـ
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 دالة التجزئة الأساسية مرتين باستخدام مفتاحَي بادّة مشتقَّين مختلفين. البناء معرَّف في RFC 2104 ومُثبَت كونه دالة شبه عشوائية (PRF) في ظل الافتراضات التشفيرية القياسية. يُبطَّن المفتاح أولاً أو يُجزَّأ ليتطابق مع حجم كتلة دالة التجزئة (64 بايت لـ SHA-256، و128 بايت لـ SHA-512).

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

تُجري الخوارزمية عملية XOR بين المفتاح المبطَّن وثابت البادة الداخلية (ipad، 0x36 مكررة)، تُسلسِله مع الرسالة، وتُجزِّئ الناتج. ثم تُجري XOR بين المفتاح المبطَّن وثابت البادة الخارجية (opad، 0x5C مكررة)، تُسلسِله مع مخرج التجزئة الداخلية، وتُجزِّئ مرة ثانية. هذا البناء المزدوج للتجزئة هو ما يمنع هجمات تمديد الطول ويضمن عدم إمكانية حساب مخرج HMAC دون معرفة المفتاح السري.

أمثلة كود HMAC

يتوفر دعم HMAC بشكل أصلي في كل لغة وبيئة تشغيل رئيسية. توفر Web Crypto API خوارزميات HMAC-SHA256 وHMAC-SHA384 وHMAC-SHA512 في المتصفحات دون الحاجة إلى أي مكتبة. تعرض الأمثلة أدناه أنماط استخدام من الواقع تشمل التحقق من webhook والمقارنة في وقت ثابت.

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) تأخذ رسالةً فقط مدخلاً وتُنتج ملخصاً يستطيع أي شخص حسابه. أما HMAC فيأخذ رسالةً ومفتاحاً سرياً، مُنتجاً توقيعاً لا يستطيع توليده أو التحقق منه إلا من يمتلك المفتاح. يعني ذلك أن HMAC يوفر المصادقة (إثبات هوية المُرسِل) إضافةً إلى التحقق من السلامة. التجزئة العادية تُثبت فقط أن البيانات لم تتغير، لا من أنتجها.
هل HMAC-SHA256 آمن؟
نعم. يُعدّ HMAC-SHA256 آمناً حتى عام 2026. يعتمد أمانه على الخصائص شبه العشوائية لـ SHA-256 وعلى البناء الخاص بـ HMAC (RFC 2104). لم يُثبَت أي هجوم عملي ضد HMAC-SHA256. بل إن HMAC-MD5 وHMAC-SHA1 يظلان آمنَين عملياً، لأن أمان HMAC لا يستلزم مقاومة تصادم كاملة من دالة التجزئة الأساسية، وإن كانت متغيرات SHA-2 هي التوصية للأنظمة الجديدة.
لماذا تستخدم webhooks خوارزمية HMAC بدلاً من تشفير الحمولة؟
تحتوي حمولات webhook عادةً على بيانات يتوقعها المستقبِل أصلاً — تفاصيل الطلبات وإشعارات الأحداث وتحديثات الحالة. الهدف ليس إخفاء البيانات (السرية) بل إثبات أنها صادرة من المُرسِل الشرعي ولم تُعدَّل أثناء النقل (الأصالة والسلامة). يُحقق HMAC ذلك بأقل تعقيد ممكن: يحسب المُرسِل HMAC للحمولة بسر مشترك ويدرجه في رأس HTTP. يُعيد المستقبِل حساب HMAC ويقارن. أما التشفير فسيُضيف تعقيداً وعبء إدارة مفاتيح غير ضرورَين.
كيف أُقارن توقيعات HMAC بأمان؟
استخدم دائماً دالة مقارنة في وقت ثابت. في Python استخدم hmac.compare_digest()، وفي Node.js استخدم crypto.timingSafeEqual()، وفي Go استخدم hmac.Equal(). يمكن لعوامل المساواة النصية القياسية (== أو ===) تسريب معلومات توقيتية: يستطيع المهاجم قياس مدة المقارنة لتحديد عدد البايتات المتطابقة بين توقيعه المزيَّف والتوقيع الصحيح، ثم استغلال ذلك لاختراق البايتات المتبقية بايتاً بايتاً.
هل يمكن عكس HMAC لاسترداد المفتاح السري؟
لا. يستند HMAC إلى دالة تجزئة أحادية الاتجاه، لذا لا يوجد اختصار رياضي لاستخراج المفتاح من مخرج HMAC. سيحتاج المهاجم إلى اختبار فضاء المفاتيح بالقوة الغاشمة، وهو أمر غير مجدٍ للمفاتيح التي تبلغ 128 بت أو أكثر. غير أن المفاتيح الضعيفة أو القصيرة (كالكلمات المرورية البسيطة) قد تكون عُرضةً لهجمات القاموس، لذا استخدم دائماً مفاتيح عشوائية تشفيرياً لا تقل عن 256 بت لـ HMAC-SHA256.
ماذا يحدث إذا كان مفتاح HMAC أطول من حجم كتلة التجزئة؟
إذا كان المفتاح السري أطول من حجم كتلة دالة التجزئة (64 بايت لـ SHA-256، و128 بايت لـ SHA-512)، تُجزِّئ خوارزمية HMAC المفتاح أولاً بدالة التجزئة الأساسية لاختزاله إلى طول مخرج التجزئة، ثم تستخدم تلك التجزئة مفتاحاً فعلياً. يعني ذلك أن المفاتيح الطويلة جداً لا توفر أماناً إضافياً يتجاوز حجم مخرج التجزئة. لـ HMAC-SHA256، المفاتيح الأطول من 64 بايت تُختزَل إلى 32 بايت ولا تقدم تحسناً أمنياً مقارنةً بمفتاح 64 بايت؛ المفاتيح حتى 64 بايت تُستخدم بطولها الكامل.
متى يجب أن أستخدم HMAC-SHA512 بدلاً من HMAC-SHA256؟
استخدم HMAC-SHA512 حين يفرضه البروتوكول (بعض دوال اشتقاق المفاتيح كـ HKDF-SHA512 وتوليد مفاتيح Ed25519)، أو حين تحتاج إلى توقيع أوسع للدفاع المعمَّق، أو عند التشغيل على أجهزة 64 بت حيث تكون SHA-512 أسرع فعلياً من SHA-256. لمعظم تطبيقات الويب وتوقيع الواجهات البرمجية والتحقق من webhook، يوفر HMAC-SHA256 أماناً كافياً وهو الخيار الأشيع في مختلف البيئات.