RFC 2104
HMAC (Hash-based Message Authentication Code, RFC 2104) — это механизм аутентификации сообщений, основанный на криптографической хеш-функции, который позволяет проверить целостность и подлинность данных с помощью секретного ключа. Определён в стандарте RFC 2104, опубликованном в феврале 1997 года.
История и стандартизация
Разработка HMAC была вызвана необходимостью создания надёжного и универсального метода аутентификации сообщений, который не зависел бы от конкретной реализации хеш-функции. До появления HMAC существовали различные схемы, но они часто были уязвимы для атак, связанных с удлинением ключа или коллизиями хешей.
Стандарт RFC 2104 был предложен Хьюго Кравчиком, Михалиром Белларе, Раном Канецци и Джоном Кершоу. Он был принят как интернет-стандарт (STD 54) и с тех пор широко внедрён в протоколы безопасности, такие как IPsec, TLS, SSH и другие.
Принцип работы
HMAC использует криптографическую хеш-функцию (например, MD5, SHA-1, SHA-256) и секретный ключ для вычисления кода аутентификации сообщения (MAC). Основная идея заключается в двойном хешировании с применением ключа, что предотвращает атаки на основе удлинения сообщения.
Формально HMAC(K, m) вычисляется как:
HMAC(K, m) = H( (K' ⊕ opad) || H( (K' ⊕ ipad) || m ) )
Где:
- H — криптографическая хеш-функция.
- K — секретный ключ.
- K' — ключ, дополненный до длины блока хеш-функции (обычно 64 байта) нулями.
- ipad — внутренняя константа (0x36, повторённая до длины блока).
- opad — внешняя константа (0x5C, повторённая до длины блока).
- ⊕ — операция XOR (исключающее ИЛИ).
- || — конкатенация (соединение) данных.
Этапы вычисления
- Подготовка ключа: Если длина ключа K превышает длину блока хеш-функции, он сначала хешируется, и результат используется как новый ключ. Если ключ короче блока, он дополняется нулями до длины блока.
- Внутреннее хеширование: Ключ XOR-ится с ipad, к результату добавляется сообщение m, и всё это хешируется.
- Внешнее хеширование: Ключ XOR-ится с opad, к результату добавляется хеш из предыдущего шага, и всё это снова хешируется.
Результат — фиксированной длины код аутентификации, который прикрепляется к сообщению.
Классификация и виды
HMAC не имеет строгой классификации по типам, но различается по используемой хеш-функции. Наиболее распространённые варианты:
- HMAC-MD5 — основан на MD5. Считается устаревшим из-за уязвимостей MD5 к коллизиям, но всё ещё используется в некоторых унаследованных системах.
- HMAC-SHA1 — основан на SHA-1. Долгое время был стандартом, но с 2005 года рекомендуется к замене на более стойкие варианты.
- HMAC-SHA256 — основан на SHA-256. Является современным стандартом для большинства приложений.
- HMAC-SHA3 — основан на SHA-3 (Keccak). Используется в новых системах, где требуется повышенная криптостойкость.
Устройство и характеристики
Ключевые свойства
- Секретность ключа: Без знания ключа невозможно вычислить корректный MAC для произвольного сообщения.
- Целостность: Любое изменение сообщения или MAC приводит к несовпадению при проверке.
- Устойчивость к атакам: HMAC устойчив к атакам на основе удлинения сообщения, которые возможны для простых схем типа H(key || message).
- Длина выхода: Равна длине выхода используемой хеш-функции (например, 32 байта для SHA-256).
Безопасность
Безопасность HMAC зависит от стойкости используемой хеш-функции и длины ключа. Стандарт рекомендует использовать ключи длиной не менее длины выхода хеш-функции (например, 32 байта для SHA-256). При правильном использовании HMAC считается криптостойким.
Применение
HMAC широко применяется в различных протоколах и системах безопасности:
- IPsec — для аутентификации пакетов в протоколах AH и ESP.
- TLS/SSL — для аутентификации сообщений в рукопожатии и записи.
- SSH — для аутентификации сеансовых ключей и сообщений.
- HTTP Digest Authentication — для аутентификации пользователей.
- API-ключи и токены — для проверки подлинности запросов (например, в AWS Signature Version 4).
- JSON Web Tokens (JWT) — для подписи токенов (алгоритм HS256).
- Системы управления паролями — для хеширования паролей с солью (PBKDF2 использует HMAC).
Примеры
Пример вычисления HMAC-SHA256
Пусть:
- Ключ:
0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b(20 байт) - Сообщение:
4869205468657265(ASCII "Hi There")
Результат HMAC-SHA256 (в шестнадцатеричном виде): b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7
Этот пример соответствует тестовому вектору из RFC 4231.
Критика и ограничения
- Зависимость от хеш-функции: HMAC наследует слабости используемой хеш-функции. Например, HMAC-MD5 считается небезопасным для новых приложений.
- Управление ключами: Безопасность HMAC полностью зависит от секретности ключа. Утечка ключа компрометирует все сообщения.
- Отсутствие шифрования: HMAC не шифрует данные, только аутентифицирует. Для конфиденциальности требуется дополнительное шифрование.
- Атаки на реализацию: Неправильная реализация (например, использование одинакового ключа для разных целей) может привести к уязвимостям.
Источники
- RFC 2104: HMAC: Keyed-Hashing for Message Authentication
- RFC 4231: Identifiers and Test Vectors for HMAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512
- RFC 6151: Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms
- NIST SP 800-107: Recommendation for Applications Using Approved Hash Algorithms
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →