Skip to main content
CheckTown
Інструменти

HMAC: як працює автентифікація повідомлень на основі хешу

Опубліковано 6 хв читання
У цій статті

Що таке HMAC?

HMAC (Hash-based Message Authentication Code) — це криптографічний механізм, який поєднує секретний ключ з хеш-функцією для створення коду автентифікації повідомлення. На відміну від звичайного хешу, HMAC доводить як цілісність, так і автентичність повідомлення.

HMAC визначений у RFC 2104 і використовується в TLS, IPsec, підписах JWT та верифікації вебхуків API. Алгоритм стійкий до атак подовження довжини, які впливають на прості хеш-функції.

Як працює HMAC

HMAC використовує двопрохідний підхід хешування з внутрішнім та зовнішнім доповненням. Секретний ключ доповнюється до розміру блоку хеш-функції, потім комбінується з двома різними константами.

  • Внутрішній хеш — ключ комбінується з ipad (0x36), конкатенується з повідомленням і хешується: H(K XOR ipad || повідомлення)
  • Зовнішній хеш — ключ комбінується з opad (0x5C), конкатенується з результатом внутрішнього хешу: H(K XOR opad || inner_hash)
  • Кінцевий результат — результат зовнішнього хешу є значенням HMAC, зазвичай представленим як шістнадцятковий рядок

Ця конструкція подвійного хешування запобігає атакам подовження довжини. Навіть якщо зловмисник знає H(повідомлення), він не може обчислити HMAC(ключ, повідомлення || додаткові_дані) без секретного ключа.

Алгоритми HMAC

Конструкція HMAC працює з будь-якою криптографічною хеш-функцією. Найпоширеніші варіанти — SHA-256, SHA-384 та SHA-512.

  • HMAC-SHA256 — 256-бітний вихід, найпоширеніший варіант для автентифікації API, підписів JWT HS256 та верифікації вебхуків. Рекомендований розмір ключа: 32 байти
  • HMAC-SHA384 — 384-бітний вихід, використовується в наборах шифрів TLS 1.3 та додатках високої безпеки. Рекомендований розмір ключа: 48 байтів
  • HMAC-SHA512 — 512-бітний вихід, переважний коли потрібен максимальний запас безпеки. Рекомендований розмір ключа: 64 байти

Ключ повинен бути щонайменше такої ж довжини, як вихід хешу. Для більшості застосувань HMAC-SHA256 з випадковим 32-байтним ключем забезпечує відмінну безпеку.

Спробуйте безкоштовно — реєстрація не потрібна

Згенерувати підписи HMAC →

Типові випадки використання

HMAC є основою багатьох протоколів безпеки та схем автентифікації API.

  • Автентифікація API — сервіси як Stripe, GitHub та AWS використовують підписи HMAC для верифікації навантажень вебхуків
  • Підписання JWT — алгоритми HS256, HS384 та HS512 використовують HMAC для підписання навантаження токена
  • Цілісність повідомлень — HMAC перевіряє, що дані не були змінені під час передачі
  • OAuth 1.0a — метод підпису HMAC-SHA1 підписує параметри запиту OAuth для підтвердження авторизації клієнта

HMAC проти інших методів автентифікації

HMAC — один з кількох підходів до автентифікації повідомлень. Кожен має різні компроміси щодо безпеки, продуктивності та управління ключами.

  • HMAC проти цифрових підписів — HMAC використовує спільний секретний ключ (симетричний), цифрові підписи використовують пари ключів (асиметричний). HMAC швидший, але вимагає спільного секрету.
  • HMAC проти API-ключів — API-ключі є простими bearer-токенами. HMAC підписує вміст запиту, запобігаючи підробці нових запитів з перехоплених.
  • HMAC проти простого хешування — хешування доводить цілісність, але не автентичність. HMAC вимагає секретний ключ.

Часті запитання

Яка ідеальна довжина ключа HMAC?

Ключ повинен бути щонайменше такої ж довжини, як вихід хешу — 32 байти для HMAC-SHA256, 48 для HMAC-SHA384, 64 для HMAC-SHA512. Коротші ключі послаблюють безпеку.

Чи HMAC те саме, що шифрування?

Ні. HMAC забезпечує автентифікацію та цілісність, не конфіденційність. Повідомлення залишається читабельним. Використовуйте шифрування (AES, ChaCha20) додатково до HMAC.

Чи можу я використовувати HMAC у браузері з Web Crypto API?

Так. Web Crypto API підтримує HMAC нативно через crypto.subtle.importKey() та crypto.subtle.sign(). Ви можете генерувати підписи HMAC повністю на стороні клієнта.

Пов'язані інструменти