**HMAC** (گاهی به عنوان (به انگلیسی: keyed-hash message authentication code) (کد احراز هویت پیام درهم‌سازی شده) یا (به انگلیسی: hash-based message authentication code) (کد اصالت‌سنجی پیام برپایه درهم‌سازی))، ساختار معینی برای محاسبه  کد تأیید هویت پیام (MAC) در رمزنگاری است که شامل یک تابع درهم ساز رمزنگاری در ترکیب با یک کلید رمز است. HMAC نیز مانند هر MAC، می‌تواند *جامعیت داده* و *اعتبار* یک پیام را همزمان بررسی کند. هر تابع درهم ساز رمزنگاری مانند ام‌دی۵ یا SHA-1، را می‌توان برای محاسبهٔ HMAC استفاده کرد. به این ترتیب الگوریتم MAC نتیجه شده، HMAC-MD5 یا HMAC-SHA1 نامیده می‌شود. قدرت رمزنگاری HMAC به قدرت رمزنگاری تابع درهم ساز به کاررفته در آن، اندازهٔ بیتی طول خروجی درهم ساز آن و اندازه و کیفیت کلید رمزنگاری بستگی دارد.  

یک تابع درهم ساز تکراری، پیام را به بلوک‌هایی با اندازه معین تقسیم می‌کند و تابع فشرده‌سازی را روی آن‌ها تکرار می‌کند. به عنوان مثال، MD5 و SHA-1، روی بلوک‌های ۵۱۲ بیتی عمل می‌کنند. اندازهٔ خروجی HMAC با انداره تابع درهم ساز به کاررفته در آن یکسان است. (در حالت MD5یا SHA-1، 128 یا ۱۶۰ بیت). هرچند این اندازه می‌تواند در صورت لزوم کوتاه شود.  

تعریف و تحلیل یک ساختار HMAC، اولین بار در سال ۱۹۹۶ توسط مهیر بلیر، ران کنتی و هوگو کرازیک که RFC 2104 را نیز نوشته بود، منتشر شد. همچنین این مقاله گونه‌ای را تعریف کرد که NMAC نامیده می‌شد و تاکنون به ندرت استفاده شده‌است. استاندارد پردازش اطلاعات فدرال، استفاده از HMACها را عمومیت بخشید و استانداردسازی کرد. HMAC-SHA-1 و HMAC-MD5 در پروتکل‌های آی‌پی‌سک و TLS استفاده می‌شوند.

تعریف (از RFC 2104)
-------------------

فرض کنید:

* (.)**H** یک تابع درهم‌ساز رمزنگاری است.
* *K* کلید رمزی است که تعدادی صفر به سمت راست آن اضافه شده‌است تا اندازهٔ بلوک‌های تابع درهم‌ساز شود.
* *m* پیامی است که باید تأیید هویت شود.
* || نشاندهندهٔ عمل الحاق است.
* ⊕ نشاندهندهٔ یای انحصاری است (XOR)
* opad اضافه کردن بیت خارجی است (0x5c5c5c…5c5c، ثابت هگزادسیمال به اندازهٔ طول یک بلوک)
* ipad اضافه کردن بیت داخلی است (0x363636…3636، ثابت هگزادسیمال به اندازهٔ طول یک بلوک)

بنابراین تعریف ریاضی (**HMAC**(*K*,*m* به صورت زیر است:

*HMAC* (*K*,*m*) = *H*((*K* ⊕ *opad*) ∥ *H*((*K* ⊕ *ipad*) ∥ *m*))

پیاده سازی
----------

شبه کد زیر نشان می‌دهد که HMAC چگونه می‌تواند پیاده‌سازی شود:

```
 **function** hmac (key, message)
    **if** (length(key) > blocksize) **then**
        key = hash(key) *// keys longer than blocksize are shortened*
    **end if**
    **if** (length(key) < blocksize) **then**
        key = key || zeroes(blocksize - length(key)) // keys shorter than blocksize are zero-padded
    **end if**
```

```
    o_key_pad = [0x5c * blocksize] ⊕ key *// Where blocksize is that of the underlying hash function*
    i_key_pad = [0x36 * blocksize] ⊕ key *// Where ⊕ is exclusive or (XOR)*
```

```
    **return** hash(o_key_pad || hash(i_key_pad || message)) *// Where || is concatenation*
**end function**
```

مثال کاربردی
------------

تجارتی که دچار حمله‌های سفارش‌های جعلی اینترنتی می‌شود، می‌تواند تأکید کند که کلیهٔ مشتریانش یک کلید رمز ارسال کنند. مشتری باید خلاصهٔ HMAC سفارش را که با استفاده از کلید متقارن مشتری محاسبه شده‌است، همراه با سفارش ذخیره کند. به این ترتیب این تجارت با دانستن کلید متقارن مشتری، می‌تواند آن سفارشی را تأیید کند که از طرف خود مشتری است و دستکاری نشده‌است.

اصول طراحی
----------

انگیزهٔ طراحی خصوصیات HMAC بدلیل وجود حمله‌ها به مکانیسم‌های بی‌اهمیت بیشتری ایجاد شد تا یک کلید را با یک تابع درهم ساز ترکیب کند. به عنوان مثال، یک نفر ممکن است فرض کند امنیتی که HMAC فراهم می‌کند، همان امنیتی است که می‌توان با ‎ MAC = H(key ∥ message)‎ بدست آورد. درحالیکه این روش دارای نقص‌های جدی است: در اکثر توابع درهمساز، بدون دانستن کلید، می‌توان به راحتی داده‌هایی را به پیام اضافه نمود و MAC معتبر دیگری بدست آورد. همچنین، اضافه کردن کلید با استفاده از‎ MAC = H(message ∥ key)‎ دارای این مشکل است که مهاجمی که بتواند در تابع درهم ساز (بدون کلید) برخوردی پیدا کند، در MAC هم می‌تواند پیدا کند. با اینکه مقاله‌های امنیتی متعددی به آسیب پذیری‌هایی در‎ MAC = H(key ∥ message ∥ key)‎، حتی زمانیکه از دو کلید متفاوت استفاده می‌شود، اشاره داشته‌اند، اما استفاده از این رویکرد بهتر است.
  

هیچ حملهٔ پسوندی شناخته شده‌ای دربرابر خصوصیات HMAC فعلی که به صورت‎ H(key1 ∥ H(key2 ∥ message))‎ تعریف شده، یافت نشده‌است. زیرا درخواست تابع درهمساز بیرونی، نتیجهٔ متوسط درهم ساز داخلی را پنهان می‌کند. مقادیر ipad و opad، برای امنیت این الگوریتم، قطعی نیستند. اما برای داشتن فاصله همینگ بزرگ از یکدیگر تعریف شده‌اند. به این ترتیب کلیدهای داخلی و خارجی، بیت‌های مشترک کمتری خواهند داشت.

امنیت
-----

قدرت رمزنگاری HMAC بستگی به اندازهٔ کلید رمز مورد استفاده دارد. شایع‌ترین حمله روی HMACها برای کشف کلید رمز، حملهٔ کورکورانه‌است. HMACها به‌طور قابل ملاحظه‌ای کمتر از الگوریتم‌های درهمساز به کاررفته در آن‌ها تحت تأثیر برخوردها قرار می‌گیرند.
  

در سال ۲۰۰۶، جانگ سونگ کیم، الکس بیریوکف، بارت پرنیل و سوکی هونگ نشان دادند چگونه می‌توان HMAC با نسخه‌های کاهش یافتهٔ MD5 یا SHA-1 یا نسخه‌های کامل HAVAL، MD4 و SHA-0 را از یک تابع تصادفی یا HMAC با یک تابع تصادفی تشخیص داد. تمایزدهنده‌های تفاضلی به مهاجم این اجازه را می‌دهند که یک حملهٔ ساختگی روی HMAC ترتیب دهد. علاوه بر این، تمایزدهنده‌های مستطیلی و تفاضلی می‌توانند منجر به حمله‌های پیش‌تصویر دوم شوند. HMACی که از نسخهٔ کامل MD4 استفاده می‌کند، می‌تواند با این آگاهی‌ها جعل شود. این حمله‌ها تناقضی برای اثبات امنیت HMAC نیست بلکه بینشی از HMAC را براساس توابع درهم ساز رمزنگاری موجود ارائه می‌دهد.

پیوند به بیرون
--------------

* FIPS PUB 198, *The Keyed-Hash Message Authentication Code*
* PHP HMAC implementation
* Python HMAC implementation
* Perl HMAC implementation
* Ruby HMAC implementation
* C HMAC implementation
* Java implementation
* JavaScript HMAC implementation
* Lightweight JavaScript implementation (SHA-256 & HMAC SHA-256)
* System.Security.Cryptography.HMAC[*پیوند مرده*]

منابع و پانویس‌ها
-----------------

1. ↑  Bellare, Mihir; Canetti, Ran; Krawczyk, Hugo (1996). "Keying Hash Functions for Message Authentication".`{{cite web}}`: نگهداری CS1: پست اسکریپت (link)
2. ↑  Preneel, Bart; van Oorschot, Paul C. (1995). "MDx-MAC and Building Fast MACs from Hash Functions". Archived from the original on 4 June 2010. Retrieved 2009-08-28.`{{cite web}}`: نگهداری CS1: پست اسکریپت (link)
3. ↑  Preneel, Bart; van Oorschot, Paul C. (1995). "On the Security of Two MAC Algorithms". Archived from the original on 23 February 2009. Retrieved 2009-08-28.`{{cite web}}`: نگهداری CS1: پست اسکریپت (link)
4. ↑  Bruce Schneier (August 2005). "SHA-1 Broken". Retrieved 2009-01-09. *although it doesn't affect applications such as HMAC where collisions aren't important*
5. ↑  IETF (February 1997). "RFC 2104". Retrieved 2009-12-03. *The strongest attack known against HMAC is based on the frequency of collisions for the hash function H («birthday attack») [PV,BCK2], and is totally impractical for minimally reasonable hash functions.*
6. ↑  Bellare, Mihir (June 2006). "New Proofs for NMAC and HMAC: Security without Collision-Resistance". In Dwork, Cynthia (ed.). *Advances in Cryptology – Crypto 2006 Proceedings*. Lecture Notes in Computer Science 4117. Springer-Verlag. Archived from the original on 16 July 2011. Retrieved 2010-05-25. *This paper proves that HMAC is a PRF under the sole assumption that the compression function is a PRF. This recovers a proof based guarantee since no known attacks compromise the pseudorandomness of the compression function, and it also helps explain the resistance-to-attack that HMAC has shown even when implemented with hash functions whose (weak) collision resistance is compromised.* `{{cite conference}}`: نگهداری یادکرد:تاریخ و سال (link)
7. ↑  Jongsung, Kim (2006). "On the Security of HMAC and NMAC Based on HAVAL, MD4, MD5, SHA-0 and SHA-1" (PDF). Archived from the original (PDF) on 12 May 2013. Retrieved 5 December 2010. `{{cite journal}}`: Cite journal requires `|journal=` (help); Unknown parameter `|coauthors=` ignored (`|author=` suggested) (help)نگهداری CS1: پست اسکریپت (link)

پانوشت

* Mihir Bellare, Ran Canetti and Hugo Krawczyk, Keying Hash Functions for Message Authentication, CRYPTO 1996, pp1–15 (PS or PDF) بایگانی‌شده در ۹ مه ۲۰۰۹ توسط Wayback Machine.
* Mihir Bellare, Ran Canetti and Hugo Krawczyk, Message authentication using hash functions: The HMAC construction, *CryptoBytes* 2(1), Spring 1996 (PS or PDF) بایگانی‌شده در ۹ مه ۲۰۰۹ توسط Wayback Machine.

* برگردان از مقاله HMAC در بخش انگلیسی ویکی‌پدیا