كيفية استخدام مولّد 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، لذا تطابق النتيجة مكتبات جانب الخادم بايتاً ببايت عند توقيع البايتات الخام نفسها.