HMAC

في علم التشفير، HMAC (وهي اختصار لـ رمز مصادقة الرسالة استنادًا على التجزئة ذات المفتاح أو رمز مصادقة الرسالة استنادًا على التجزئة هاش) هي نوع معين من رمز مصادقة الرسالة (MAC) متضمنةً لـ دالة التجزئة التشفيرية ولمفتاح تشفيري سري.

كما هو الحال مع أي رمز مصادقة الرسالة (MAC) يمكن استخدامه للتحقق من سلامة البيانات ومن صحة الرسالة في الوقت ذاته.

يمكن استخدام أيّة دالة تجزئة تشفيرية كـ SHA-256 أو SHA-3 في حساب HMAC (رمز مصادقة الرسالة استنادًا على التجزئة)

وتسمى خوارزمية MAC الناتجة HMAC-X، حيث أنَّ X تعبر عن دالة التجزئة المستخدمة (مثال: HMAC-SHA256 أو HMAC-SHA3)

تعتمد قوة التشفير في الـ HMAC على قوة تشفير دالة التجزئة المستخدمة، وعلى حجم خرج التجزئة، وعلى حجم ونوعية المفتاح.

يستخدم HMAC مرورين (دورتين) في حساب التجزئة. أولًا يستخدم المفتاح السري ليتم اشتقاق مفتاحين منه – واحد داخلي والآخر خارجي

ينتج في المرور الأول من الخوارزمية تجزئة/هاش داخلي وهو مشتق من الرسالة ومن المفتاح الداخلي. في المرور الثاني ينتج رمز الـ HMAC النهائي وهو مشتق من التجزئة/الهاش الداخلي الناتج ومن المفتاح الخارجي.

وهكذا توفر الخوارزمية حصانة أفضل ضد هجمات تمديد الطول (length extension attacks).

تجزأ دالة التجزئة التكرارية الرسالة إلى عدة كتل ذات حجم ثابت وتتكرر عليهم بوساطة دالة ضغط

على سبيل المثال: يعمل SHA-256  على كتل 512-بت

حجم خرج الـ HMAC يساوي حجم دالة التجزئة المستخدمة (مثال: 256 و1600 بت في حالة SHA-256 وSHA-3 على التوالي)، على الرغم من أنه يمكن اقتطاعه عند الرغبة.

الـHMAC لا يقوم بتشفير الرسالة. عوضًا عن ذلك، يجب إرسال الرسالة (سوآء مشفرة أم لا) إلى جانب تجزئة/هاش الـHMAC

ستقوم الأطراف التي تحتوي على المفتاح السري بتجزئة الرسالة مرة أخرى بأنفسهم، وإذا كانت الرسالة أصلية، فستتطابق التجزئتان المستلمة والمحسوبة.

نُشر تعريف وتحليل بناء HMAC لأول مرة في عام 1996 في ورقة كتبها Mihir Bellare و Ran Canetti و Hugo Krawczyk ،  وكتبوا أيضًا RFC 2104 في عام 1997. حددت ورقة عام 1996 أيضًا متغيرًا متداخلاً يُسمى NMAC. يقوم FIPS PUB 198 بتعميم وتوحيد استخدام HMACs.

يتم استخدام HMAC داخل بروتوكولات IPsec و TLS و JSON Web Tokens.

تعريف 
هذا التعريف مأخوذ من RFC 2104 :

 

حيث،

 H هي دالة تجزئة تشفيرية
 م هي الرسالة المراد توثيقها
 K هو المفتاح السري
 K  هو مفتاح بحجم الكتلة مشتق من المفتاح السري K ؛ إما عن طريق الحشو إلى اليمين بصفر يصل إلى حجم الكتلة، أو بالتخفيض إلى أقل من حجم الكتلة أولًا ثم الحشو إلى اليمين باستخدام الأصفار
 || يدل على الضم
 ⊕ يدل على أحادي المعامل عملية الاستثناء أو (XOR)
 opad عبارة عن حشوة خارجية بحجم الكتلة، تتكون من وحدات بايت متكررة بقيمة 0x5c
  هو حشوة داخلية بحجم الكتلة، تتكون من وحدات بايت متكررة بقيمة 0x36

 التنفيذ 
يوضح الكود الزائف التالي كيفية تنفيذ HMAC. حجم الكتلة هو 64 (بايت) وذلك عند استخدام إحدى دالات التجزئة التالية: SHA-1 ، MD5 ، RIPEMD-128/160.
 function hmac   key:  Bytes  // مصفوفة البايتات

 message: Bytes  // مصفوفة بايتات المراد تجزئتها

 hash:  Function // دالة هاش التجزئة المستخدمة

 blockSize: Integer // حجم كتلة دالة التجزئة المستخدمة

 outputSize: Integer // حجم الخرج لدالة التجزئة المستخدمة

 // يتم تقصير المفاتيح الأطول من حجم الكتلة عن طريق تجزئتها

  (length(key) > blockSize)  key ← hash(key)

 // يتم حشو المفاتيح الأقصر من كتلة الحجم بالحشو مع الأصفار على اليمين

  (length(key) < blockSize)  key ← Pad(key, blockSize)

 o_key_pad ← key xor [0x5c * blockSize] // مفتاح حشو خارجي

  i_key_pad ← key xor [0x36 * blockSize] // مفتاح حشو داخلي

  ' hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // حيث يتم الضم ∥

المراجع

وصلات خارجية 

 RFC2104
 حاسبة HMAC عبر الإنترنت للعشرات من خوارزميات التجزئة الأساسية
 أداة إنشاء / اختبار HMAC عبر الإنترنت
 FIPS PUB 198-1 ، رمز مصادقة رسالة التجزئة - HMAC
 تنفيذ HMAC
 تنفيذ Python HMAC
 تنفيذ جافا
 أداة اختبار HMAC-SHA-256 عبر الإنترنت

فهرسة دالاتية