ما هو HMAC؟
HMAC (رمز مصادقة الرسالة المعتمد على التجزئة) يجمع مفتاحاً سرياً مع دالة تجزئة مثل SHA-256 لإنتاج علامة تثبت أن الرسالة أنشأها من يملك المفتاح ولم تُعدَّل بعدها. هو ما يوقّع رموز JWT من نوع HS256 ومعظم حمولات webhook؛ والتحقق منه يعني إعادة حسابه بالمفتاح نفسه والمقارنة بزمن ثابت.
المزوّد يوقّع
- 1HMAC للنص الخام بالسرّ المشتركعادةً HMAC-SHA256؛ وتوقّع Stripe
timestamp.rawBody - 2يرسل النص وترويسة التوقيع
X-Hub-Signature-256: sha256=<hex>
أنت تتحقق من التسليم
- 3إعادة الحساب على البايتات الخام بالضبطالنص الخام، والسرّ بترميز المفتاح الصحيح، وقيمة
tفي حقل الطابع الزمني في حالة Stripeهذه الأداة - 4المقارنة مع التوقيع المستلَميُلصق التوقيع مع البادئة
sha256=أوv1=أو بدونها، والنتيجة: يتطابق أو لا يتطابقهذه الأداةفرع: نص أُعيدت سلسلته، أو ترميز مفتاح خاطئ، أو غياب بادئة الطابع الزمني، أو سطر جديد في النهايةفشل
- في بيئة الإنتاج: خادمكيكرّر الخطوتين 3 و4 مع كل تسليم ويقارن بزمن ثابت
كيفية استخدام مولّد HMAC
- الصق نص الطلب الخام أو الرسالة بالضبط.
- أدخل السرّ واختر ترميزه (نص أو سداسي عشري أو Base64).
- اختر الخوارزمية التي يستخدمها مزوّدك (عادةً HMAC-SHA256).
- أضف اختيارياً الطابع الزمني من ترويسة المزوّد والصق التوقيع المستلَم للتحقق منه.
- انسخ التوقيع بصيغة سداسية عشرية أو Base64.
مزايا مولّد HMAC
- HMAC-SHA256 وSHA-1 وSHA-384 وSHA-512 باستخدام WebCrypto
- المفتاح كنص UTF-8 أو بايتات سداسية عشرية أو Base64
- مدخل توقيع اختياري بصيغة «timestamp.payload» على طريقة Stripe
- التحقق من توقيع مستلَم (يقبل البادئتين sha256= وv1=، بصيغة سداسية عشرية أو Base64)
- صيغ ترويسات جاهزة لـ webhook الخاصة بـ GitHub وShopify وStripe
- لا تغادر الأسرار المتصفح أبداً
مثال على مولّد HMAC
HMAC-SHA256 مع متجه الاختبار الكلاسيكي
الإدخال:
Message: The quick brown fox jumps over the lazy dog
Key: keyالنتيجة:
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8الأسئلة الشائعة حول مولّد HMAC
كيف أتحقق من توقيع webhook من Stripe؟
توقّع Stripe «timestamp.rawBody» باستخدام HMAC-SHA256 بسرّ نقطة النهاية لديك. الصق نص الطلب الخام، وأدخل السرّ، وضع قيمة t من ترويسة Stripe-Signature في حقل الطابع الزمني، وقارن مع قيمة v1.
كيف أتحقق من webhook من GitHub؟
يرسل GitHub الترويسة X-Hub-Signature-256: sha256=<hex>. احسب HMAC-SHA256 للنص الخام باستخدام سرّ webhook وقارن الناتج السداسي العشري؛ وتزيل الأداة البادئة «sha256=» تلقائياً.
لماذا لا يتطابق توقيعي؟
غالباً لأن النص أُعيدت سلسلته (تغيّرت المسافات أو ترتيب المفاتيح)، أو لأن المفتاح كان بصيغة Base64/سداسية عشرية لكنه عومل كنص، أو لغياب بادئة الطابع الزمني، أو لإضافة سطر جديد في النهاية. وقّع البايتات الخام بالضبط دائماً.
هل ينبغي أن يكون المفتاح سداسياً عشرياً أم Base64 أم نصاً؟
بحسب ما يقدّمه لك المزوّد. أسرار Shopify وGitHub نصوص عادية؛ وبعض واجهات API توفّر مفاتيح Base64. اختر «ترميز المفتاح» المطابق حتى تكون البايتات صحيحة.
ما HMAC بالضبط؟
يجمع HMAC (RFC 2104) بين مفتاح سري ودالة تجزئة بحيث لا يستطيع إنشاء الوسم أو التحقق منه إلا الأطراف التي تملك المفتاح. وخلافاً للتجزئة البسيطة للمفتاح+الرسالة، فهو غير معرّض لهجمات تمديد الطول.
ملاحظات تقنية
يحسب HMAC (RFC 2104) القيمة H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ message)). تُجزَّأ المفاتيح الأطول من حجم كتلة التجزئة أولاً؛ وتُحشى المفاتيح الأقصر بالأصفار. تستورد الأداة المفتاح عبر crypto.subtle.importKey وتوقّع عبر crypto.subtle.sign، لذا تطابق النتيجة مكتبات جانب الخادم بايتاً ببايت عند توقيع البايتات الخام نفسها.
المراجع
- RFC 2104: HMAC: Keyed-Hashing for Message Authenticationبناء HMAC: كيف يُنتج مفتاح سري ودالة تجزئة رمز مصادقة للرسالة.
- FIPS 198-1: The Keyed-Hash Message Authentication Code (HMAC)معيار NIST لـ HMAC، بما فيه إرشادات طول المفتاح والاقتطاع.
- RFC 6234: US Secure Hash Algorithms (SHA and SHA-based HMAC and HKDF)أوصاف مرجعية وشيفرة لـ SHA-1 وSHA-224/256/384/512 واستخدامها في HMAC.