HMAC

HMAC (گاهی به عنوان  (کد احراز هویت پیام درهم‌سازی شده) یا  (کد اصالت‌سنجی پیام برپایه درهم‌سازی))، ساختار معینی برای محاسبه  کد تأیید هویت پیام (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

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

پانوشت

 Mihir Bellare, Ran Canetti and Hugo Krawczyk, Keying Hash Functions for Message Authentication, CRYPTO 1996, pp1–15 (PS or PDF) .
 Mihir Bellare, Ran Canetti and Hugo Krawczyk, Message authentication using hash functions: The HMAC construction, CryptoBytes 2(1), Spring 1996 (PS or PDF) .

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

درهم‌سازی
کدهای اصالت‌سنجی پیام