مولّد HMAC
احسب HMAC-SHA1 أو SHA-256 أو SHA-384 أو SHA-512 بمفتاح نصي أو ست عشري أو Base64، واحصل على النتيجة وتحقق من توقيع webhook في متصفحك.
تُوقَّع الرسالة كما كُتبت تمامًا، بترميز UTF-8، بما في ذلك المسافات وفواصل الأسطر.
- HMAC (ست عشري)
- HMAC (Base64)
- ترويسة توقيع webhook (بأسلوب GitHub)
تجري المقارنة في زمن ثابت كما ينبغي أن يفعل الخادم، فلا يكشف الوقت المستغرق عدد الأحرف المتطابقة.
كيفية حساب HMAC
- الصق الرسالة. في حالة webhook، يجب أن تكون جسم الطلب الخام نفسه، بايتًا ببايت.
- أدخل المفتاح السري واختر صيغة المفتاح: نص (UTF-8) أو ست عشري أو Base64.
- اختر الخوارزمية: HMAC-SHA1 أو HMAC-SHA256 أو HMAC-SHA384 أو HMAC-SHA512.
- تتحدّث النتيجة أثناء الكتابة، ويمكنك أيضًا النقر على إنشاء HMAC. ستحصل على HMAC (ست عشري) وHMAC (Base64) وترويسة توقيع webhook (بأسلوب GitHub)، ولكل منها زر نسخ.
- للتحقق من توقيع وصلك، الصقه في حقل قارن مع توقيع متوقَّع (ست عشري أو Base64 أو sha256=…)، وستخبرك الأداة هل هو مطابق أم لا.
تُرمَّز الرسالة بـ UTF-8 كما كتبتها تمامًا، بما في ذلك المسافات وفواصل الأسطر. ويجري الحساب عبر واجهة Web Crypto في متصفحك، فلا تغادر الرسالة ولا المفتاح جهازك أبدًا.
ما هو HMAC؟
HMAC (رمز مصادقة الرسائل المبني على دالة تجزئة، المعيار RFC 2104) يجمع بين مفتاح سري ودالة تجزئة:
HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))
حيث K′ هو المفتاح بعد حشوه إلى حجم كتلة دالة التجزئة (ويُجزَّأ أولًا إذا كان أطول منها)، وipad وopad ثابتان محددان. لا يستطيع إنتاج الرمز الصحيح لرسالة ما إلا من يعرف المفتاح، وأي تغيير في الرسالة يغيّر الرمز كليًا. لهذا تُستخدم رموز HMAC لتوقيع طلبات webhook وطلبات واجهات API (مثل AWS Signature Version 4) ورموز JSON Web Token من نوع HS256.
HMAC ليس تشفيرًا: فالرسالة لا تُخفى. وهو كذلك ليس تجزئة لكلمات المرور؛ لتخزين كلمات المرور استخدم دالة بطيئة مثل bcrypt أو Argon2.
يعتمد طول الناتج على الخوارزمية: 20 بايت لـ SHA-1، و32 لـ SHA-256، و48 لـ SHA-384، و64 لـ SHA-512. ما زال HMAC-SHA1 يُعدّ آمنًا بوصفه رمز مصادقة، لكن فضّل SHA-256 في الأنظمة الجديدة. يُنصح بمفتاح عشوائي لا يقل طوله عن طول الناتج (32 بايت لـ HMAC-SHA256)، وتتيح لك صيغتا المفتاح الست عشرية وBase64 إدخال هذه البايتات العشوائية مباشرةً.
التحقق من webhook في GitHub
يوقّع GitHub كل عملية إرسال بسرّ webhook الخاص بك، ويرسل النتيجة في الترويسة X-Hub-Signature-256 على شكل sha256= متبوعًا بقيمة HMAC-SHA256 الست عشرية لجسم الطلب. يستخدم المثال في توثيق GitHub نفسه السر It's a Secret to Everybody والجسم Hello, World!؛ أدخلهما هنا مع HMAC-SHA256 فتظهر الترويسة:
X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17
يقبل حقل المقارنة سطر الترويسة كاملًا، أو القيمة sha256=…، أو توقيعًا ست عشريًا أو Base64 مجردًا (تستخدم Stripe وShopify وSlack أنظمة مشابهة بترويساتها وسلاسلها الموقّعة الخاصة). أما مع SHA-384 وSHA-512 فتعرض الأداة ترويسة عامة X-Signature، إذ لا يوجد معيار شائع لهما.
المقارنة في زمن ثابت
الخادم الذي يقارن التواقيع بمقارنة نصية عادية يتوقف عند أول حرف مختلف. وبقياس أزمنة الاستجابة، قد يتمكن المهاجم من تخمين توقيع صالح حرفًا بعد حرف. أما المقارنة في هذه الأداة فتفحص كل بايت أيًّا كانت النتيجة، كما ينبغي أن يفعل الخادم باستخدام crypto.timingSafeEqual في Node.js أو hmac.compare_digest في Python أو hash_equals في PHP.
الأسئلة الشائعة
لماذا يختلف HMAC الذي أحصل عليه عن الذي يحسبه خادمي؟
الأسباب المعتادة: رسالة مختلفة (الخادم يوقّع الجسم الخام بينما لصقتَ JSON معاد تنسيقه، أو تختلف فواصل الأسطر)، أو مفتاح بـ صيغة المفتاح الخاطئة، أو خوارزمية أخرى. حتى مسافة زائدة واحدة تغيّر النتيجة بالكامل.
هل أستخدم الناتج الست عشري أم Base64؟
كلاهما يرمّز البايتات نفسها. يستخدم GitHub الصيغة الست عشرية، بينما تستخدم واجهات API أخرى كثيرة، مثل Shopify، صيغة Base64. استخدم الصيغة التي يتوقعها النظام المستقبِل.
هل يمكنني استخدام مفتاح فارغ؟
تقبله الأداة لكنها تنبّهك: بمفتاح فارغ يستطيع أي شخص حساب HMAC نفسه، فلا يثبت شيئًا.
هل HMAC-SHA1 مكسور مثل SHA-1؟
هجمات التصادم على SHA-1 لا تكسر HMAC-SHA1، الذي ما زال يُعدّ آمنًا بوصفه رمز مصادقة. وهو مدعوم للأنظمة القديمة مثل الترويسة القديمة X-Hub-Signature، لكن ينبغي للأنظمة الجديدة استخدام HMAC-SHA256 أو ما هو أقوى.
هل مفتاحي السري آمن هنا؟
تُعالَج الرسالة والمفتاح في متصفحك فقط ولا يُرسلان إلى أي مكان. ومع ذلك، تعامل مع أسرار بيئة الإنتاج بحذر، وغيّرها إذا ظننت أنها كُشفت.
أدوات ذات صلة
- مولّد الهاش (Hash) أنشئ هاش MD5 وSHA-1 وSHA-256 وSHA-512 للنصوص أو للملفات بأي حجم، وتحقّق من المجاميع الاختبارية. كل شيء يعمل في متصفحك.
- فك ترميز JWT فك ترميز JWT واقرأ الترويسة والحمولة وتواريخ exp وiat وnbf، وتحقّق من توقيعات HS256 وRS256 وES256 وEdDSA محليًا في متصفحك.
- ترميز Base64 وفك ترميزه أداة مجانية لترميز Base64 وفك ترميزه مع دعم كامل لـ UTF-8 والعربية وخيار base64url الآمن للروابط. تعمل كليًا في متصفحك دون رفع أي شيء.
- مولّد Bcrypt ومدقّقه ولّد هاش bcrypt بمعامل كلفة من 4 إلى 14، وتحقّق من كلمة مرور مقابل هاش موجود، واعرض إصداره وكلفته وملحه وناتجه.