У цій статті
Що таке 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 повністю на стороні клієнта.