В этой статье
Что такое 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 vs другие методы аутентификации
HMAC — один из нескольких подходов к аутентификации сообщений. Каждый имеет различные компромиссы в безопасности, производительности и управлении ключами.
- HMAC vs цифровые подписи — HMAC использует общий секретный ключ (симметричный), цифровые подписи используют пары ключей (асимметричный). HMAC быстрее, но требует обмена секретом.
- HMAC vs API-ключи — API-ключи — простые bearer-токены. HMAC подписывает содержимое запроса, предотвращая подделку новых запросов из перехваченных.
- HMAC vs простое хеширование — хеширование доказывает целостность, но не подлинность. 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 полностью на стороне клиента.