HMAC
HMAC (сокр. от англ. Hash-based Message Authentication Code — код аутентификации сообщения, основанный на хешировании) — это механизм проверки подлинности и целостности данных, использующий криптографическую хеш-функцию в сочетании с секретным ключом. HMAC позволяет убедиться, что сообщение не было изменено в процессе передачи и что оно исходит от стороны, владеющей общим секретным ключом. Результатом работы HMAC является фиксированная строка бит (дайджест), которая добавляется к сообщению или передаётся отдельно.
История и стандартизация
Концепция HMAC была разработана в 1996 году Михиром Белларе (Mihir Bellare), Раном Канетти (Ran Canetti) и Хьюго Кравчиком (Hugo Krawczyk) из корпорации IBM. Предложенный ими алгоритм был опубликован в документе Internet Engineering Task Force (IETF) как RFC 2104 в феврале 1997 года. В том же году HMAC был принят в качестве стандарта Национальным институтом стандартов и технологий США (NIST) в документе FIPS PUB 198. Позднее, в 2002 году, стандарт был обновлён до FIPS PUB 198-1, а в 2008 году — до FIPS PUB 198-2. HMAC также является частью стандартов ISO/IEC 9797-2 и ISO/IEC 10116.
Принцип работы
HMAC использует любую криптографическую хеш-функцию (например, MD5, SHA-1, SHA-256, SHA-3) в качестве строительного блока. Алгоритм состоит из двух этапов хеширования, которые включают XOR-операции с ключом и двумя константами (ipad — inner pad, внутренняя прокладка, и opad — outer pad, внешняя прокладка). Формально HMAC(K, m) вычисляется следующим образом:
- Если длина ключа K больше длины блока хеш-функции (обычно 64 байта для MD5 и SHA-1, 128 байт для SHA-256), то K сначала хешируется, и результат используется как новый ключ.
- Ключ дополняется нулями до длины блока хеш-функции, получая K'.
- Вычисляется внутренний хеш: H((K' ⊕ ipad) || m), где ipad — повторяющийся байт 0x36, а || обозначает конкатенацию.
- Вычисляется внешний хеш: H((K' ⊕ opad) || H((K' ⊕ ipad) || m)), где opad — повторяющийся байт 0x5C.
Результат — дайджест фиксированной длины (зависит от используемой хеш-функции). Такая конструкция защищает от атак на основе удлинения сообщения (length extension attack), уязвимых для некоторых хеш-функций (например, MD5, SHA-1, SHA-2).
Классификация и варианты
По используемой хеш-функции
- HMAC-MD5 — использует MD5 (128-битный дайджест). Считается устаревшим из-за криптографических уязвимостей MD5, но всё ещё применяется в некоторых легаси-системах.
- HMAC-SHA1 — использует SHA-1 (160-битный дайджест). Также считается устаревшим, но широко распространён в протоколах (например, TLS 1.0/1.1, IPsec).
- HMAC-SHA256 — использует SHA-256 (256-битный дайджест). Рекомендуется NIST и большинством современных стандартов.
- HMAC-SHA384, HMAC-SHA512 — варианты с увеличенной длиной дайджеста.
- HMAC-SHA3 — использует SHA-3 (Keccak). Новый стандарт, набирающий популярность.
По области применения
- HMAC для аутентификации сообщений — используется в сетевых протоколах (TLS, SSH, IPsec, Kerberos).
- HMAC для генерации псевдослучайных чисел — применяется в алгоритмах выработки ключей (например, HKDF — HMAC-based Key Derivation Function).
- HMAC для проверки целостности данных — в системах хранения и передачи файлов.
Свойства и криптостойкость
Безопасность HMAC основана на стойкости используемой хеш-функции и секретности ключа. При условии, что хеш-функция удовлетворяет требованиям криптографической стойкости (устойчивость к коллизиям, необратимость), HMAC считается защищённым от атак подбора ключа (brute-force) и атак на основе известного текста. Длина ключа обычно составляет от 128 до 512 бит; NIST рекомендует ключи длиной не менее 128 бит для HMAC-SHA256.
Основные атаки на HMAC:
- Атака на основе удлинения сообщения — предотвращается двухпроходной конструкцией HMAC.
- Атака подбора ключа — требует перебора всех возможных ключей; сложность экспоненциальна.
- Коллизионные атаки на хеш-функцию — если хеш-функция имеет коллизии (как MD5), HMAC может быть скомпрометирован при очень длинных сообщениях, но на практике это маловероятно.
Применение
HMAC широко используется в современных криптографических протоколах и системах:
- TLS/SSL — для аутентификации сообщений в записях протокола.
- IPsec — в протоколах AH (Authentication Header) и ESP (Encapsulating Security Payload).
- SSH — для проверки целостности пакетов.
- Kerberos — для аутентификации билетов.
- API-аутентификация — многие веб-сервисы (например, Amazon Web Services, Google Cloud) используют HMAC для подписи запросов.
- Блокчейн и криптовалюты — для генерации ключей и проверки транзакций (например, в Bitcoin используется HMAC-SHA512 в процессе генерации адресов).
- Системы хранения паролей — HMAC применяется в алгоритмах PBKDF2 (Password-Based Key Derivation Function 2) для защиты паролей.
Реализации
HMAC реализован во всех основных криптографических библиотеках: OpenSSL, GnuTLS, Crypto++ (C++), Bouncy Castle (Java), PyCrypto (Python), .NET Cryptography (C#), libsodium (C). В операционных системах HMAC доступен через системные криптографические API (например, Windows CryptoAPI, macOS Security Framework).
Критика и ограничения
Основные недостатки HMAC:
- Зависимость от стойкости хеш-функции — при компрометации хеш-функции (как в случае MD5) HMAC становится уязвимым.
- Фиксированная длина дайджеста — не подходит для приложений, требующих переменной длины аутентификационного кода.
- Необходимость безопасного распределения ключей — HMAC не решает проблему обмена ключами.
В 2010-х годах были предложены альтернативы, такие как KMAC (Keccak Message Authentication Code) на основе SHA-3, которые устраняют некоторые ограничения HMAC, но HMAC остаётся наиболее распространённым стандартом.
Источники:
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication
- FIPS PUB 198-1 — The Keyed-Hash Message Authentication Code (HMAC)
- NIST Special Publication 800-107 — Recommendation for Applications Using Approved Hash Algorithms
- Bellare, M., Canetti, R., Krawczyk, H. — Keying Hash Functions for Message Authentication (1996)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →