طريقة الاستخدام
- اكتب البيانات في الرسالة. وللبيانات الثنائية اختر سداسي عشري أو Base64 تحت ترميز الرسالة.
- اكتب السر في المفتاح واختر طريقة كتابته تحت ترميز المفتاح.
- اقرأ الصفوف الأربعة في قيم HMAC. انسخ القيمة التي تحتاجها، أو قارنها بالقيمة التي يعطيها نظامك.
- إن اختلفت القيم عن نظام آخر، فتحقق من البايتات أولاً، لأن اختلاف سطر النهاية أو الترميز يعطي HMAC مختلفاً.
ما هو HMAC؟
HMAC (RFC 2104) رمز توثيق للرسالة: قيمة قصيرة لا يصنعها إلا من يعرف المفتاح السري. يُبنى من دالة تجزئة H معيّنة، تُطبَّق مرتين على الرسالة والمفتاح، لذلك يمكن استخدام الدالة نفسها للصفوف الأربعة في الجدول. ولأن المفتاح لازم، فإن تطابق HMAC يدل على أن الرسالة لم تتغير، وأن مرسلها يحمل المفتاح.
لا يخفي HMAC الرسالة. يستطيع من يملك الرسالة أن يقرأها، ولا يتيح له HMAC إلا التحقق منها.
HMAC(K, m) = H((K XOR opad) || H((K XOR ipad) || m))
ipad = البايت 0x36 مكرراً B مرة
opad = البايت 0x5C مكرراً B مرة
B = حجم كتلة H: 64 بايتاً لـ SHA-1 وSHA-256، و128 بايتاً لـ SHA-384 وSHA-512
أي دالة ومفتاح؟
HMAC-SHA-256 هو الخيار المعتاد، وهو الذي تستخدمه كثير من Webhooks وواجهات API. وHMAC-SHA-512 هو البنية نفسها بخرج أطول. ما زال HMAC-SHA-1 يظهر في الأنظمة القديمة، ولا يُختار للتصاميم الجديدة.
يجب أن يكون المفتاح عشوائياً وبطول خرج دالة التجزئة على الأقل. فالمفتاح المكتوب كلمة أو عبارة قصيرة يسهل تخمينه، والمفتاح المُخمَّن يجعل HMAC بلا قيمة.
السداسي العشري وBase64
الشكلان يعرضان البايتات نفسها. يكتب السداسي العشري كل بايت برقمين، فيكون لـ SHA-256 64 رقماً. ويكتب Base64 كل ثلاثة بايتات بأربعة أحرف، فيكون لـ SHA-256 44 حرفاً، وآخرها = للحشو (RFC 4648).
- HMAC-SHA-1: 40 رقماً سداسياً عشرياً، و28 حرفاً بـ Base64
- HMAC-SHA-256: 64 رقماً سداسياً عشرياً، و44 حرفاً بـ Base64
- HMAC-SHA-384: 96 رقماً سداسياً عشرياً، و64 حرفاً بـ Base64
- HMAC-SHA-512: 128 رقماً سداسياً عشرياً، و88 حرفاً بـ Base64
مثال محلول: RFC 4231، الحالة 2
المفتاح Jefe والرسالة what do ya want for nothing? هما الحالة الثانية في RFC 4231 لـ SHA-256 وSHA-384 وSHA-512، وفي RFC 2202 لـ SHA-1. الجدول أدناه هو ما تعرضه الصفحة لهما، وقيمة HMAC-SHA-256 فيه هي القيمة التي يطبعها RFC: 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843.
| الخوارزمية | السداسي العشري | Base64 |
|---|---|---|
| HMAC-SHA-1 | effcdf6ae5eb2fa2d27416d5f184df9c259a7c79 | 7/zfauXrL6LSdBbV8YTfnCWafHk= |
| HMAC-SHA-256 | 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843 | W9zBRr9gdU5qBCQmCJV1x1oAPwidJzmDnexYuWTsOEM= |
| HMAC-SHA-384 | af45d2e376484031617f78d2b58a6b1b9c7ef464f5a01b47e42ec3736322445e8e2240ca5e69e2c78b3239ecfab21649 | r0XS43ZIQDFhf3jStYprG5x+9GT1oBtH5C7Dc2MiRF6OIkDKXmnix4syOez6shZJ |
| HMAC-SHA-512 | 164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea2505549758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737 | Fkt6e/z4GeLjlfvnO1bgo4e9ZCIugx/WECcM1+olBVSXWL91wFqZSm0DT2X48Ob9yuqxo01Ka0tjbgcKOLznNw== |
الأسئلة الشائعة
هل HMAC هو تشفير الرسالة نفسه؟
لا. لا يخفي HMAC الرسالة، فيستطيع أي شخص قراءتها. وهو يدل على أن الرسالة لم تتغير، وأن المرسل يعرف المفتاح. وللسرية تحتاج إلى التشفير.
ما الفرق بين التجزئة وHMAC؟
تعتمد التجزئة على الرسالة وحدها، فيستطيع أي شخص حسابها. أما HMAC فيحتاج المفتاح السري أيضاً، فلا يصنعه أو يتحقق منه إلا من يملكه. وللبصمات العادية استخدم أداة مولّد بصمات التجزئة.
لماذا يختلف HMAC عن القيمة التي تعطيها مكتبتي؟
يختلف المفتاح أو بايتات الرسالة. فالمفتاح المكتوب نصاً هو بايتات UTF-8 الخاصة به، والأحرف نفسها إذا كُتبت بالنظام السداسي العشري تعطي بايتات مختلفة. كما يغيّر سطر الانتهاء في آخر الرسالة الـ HMAC.
أي طول للمفتاح أستخدم؟
مفتاح عشوائي بطول خرج دالة التجزئة على الأقل: 32 بايتاً لـ HMAC-SHA-256. ينصح RFC 2104 بشدة بألا يكون المفتاح أقصر، والمفتاح المكوّن من كلمات أو عبارة قصيرة يسهل تخمينه.
هل أستطيع فحص توقيع Webhook بهذه الصفحة؟
نعم، إن استخدمت البايتات الدقيقة التي وُقّعت. وتُحسب توقيعات Webhook عادةً على جسم الطلب الخام، فالصق الجسم دون تغيير، لأن JSON أُعيد تنسيقه يعطي HMAC مختلفاً.
هل يُرسل مفتاحي أو رسالتي إلى أي مكان؟
لا. يُحسب HMAC في متصفحك بواسطة SubtleCrypto الخاصة به، ولا يُرفع المفتاح ولا الرسالة ولا يُخزَّنان.
المصادر
- RFC 2104 (باللغة الإنجليزية): HMAC: Keyed-Hashing for Message Authentication
- RFC 4231 (باللغة الإنجليزية): Identifiers and Test Vectors for HMAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384 and HMAC-SHA-512
- RFC 2202 (باللغة الإنجليزية): Test Cases for HMAC-MD5 and HMAC-SHA-1
- RFC 4648 (باللغة الإنجليزية): The Base16, Base32, and Base64 Data Encodings
- NIST FIPS 180-4 (باللغة الإنجليزية): Secure Hash Standard (SHA-1 and the SHA-2 family)
آخر مراجعة للأرقام والنص: الثلاثاء، 30 جمادى الأولى 1448 بعد الهجرة.