الجيل HMAC-SHA1
في علم التشفير، **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 :

{\displaystyle {\begin{aligned}\operatorname {HMAC} (K,m)&=\operatorname {H} {\Bigl (}{\bigl (}K'\oplus opad{\bigr )}\parallel \operatorname {H} {\bigl (}\left(K'\oplus ipad\right)\parallel m{\bigr )}{\Bigr )}\\K'&={\begin{cases}\operatorname {H} \left(K\right)&K{\text{ is larger than block size}}\\K&{\text{otherwise}}\end{cases}}\end{aligned}}}
حيث:

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

التنفيذ
-------

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

```
function hmac **is**
```

```
**input:**
```

```
key:  Bytes  // مصفوفة البايتات
```

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

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

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

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

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

```
**if** (length(key) > blockSize) **then**
```

```
key ← hash(key)
```

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

```
**if** (length(key) < blockSize) **then**
```

```
key ← Pad(key, blockSize)
```

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

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

```
 **return** hash(o\_key\_pad ∥ hash(i\_key\_pad ∥ message)) // حيث يتم الضم ∥
```

المراجع
-------

1. ↑  Bellare، Mihir؛ Canetti، Ran؛ Krawczyk، Hugo (1996). "Keying Hash Functions for Message Authentication": 1–15. `{{استشهاد بدورية محكمة}}`: الاستشهاد بدورية محكمة يطلب `|دورية محكمة=` (مساعدة)

وصلات خارجية
------------

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

* أيقونة بوابةبوابة تعمية