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