HMAC-SHA1
HMAC-SHA1 — это криптографический механизм аутентификации сообщений, построенный на основе хеш-функции SHA-1 и использующий секретный ключ для проверки целостности и подлинности данных. HMAC (Hash-based Message Authentication Code) представляет собой алгоритм вычисления имитовставки (кода аутентичности сообщения), который защищает передаваемые данные от подделки и модификации при условии, что стороны обмена знают общий секретный ключ. HMAC-SHA1 является одной из наиболее распространённых реализаций HMAC, несмотря на постепенное вытеснение более стойкими алгоритмами (например, HMAC-SHA256).
История и стандартизация
Алгоритм HMAC был впервые описан в 1996 году в работе Mihir Bellare, Ran Canetti и Hugo Krawczyk «Keying Hash Functions for Message Authentication». В 1997 году он был опубликован как RFC 2104, который остаётся основным документом, определяющим спецификацию HMAC. Стандарт HMAC был принят Национальным институтом стандартов и технологий США (NIST) в 2002 году как FIPS PUB 198.
HMAC-SHA1, как вариант HMAC, использующий хеш-функцию SHA-1, получил широкое распространение в 2000–2010-х годах благодаря производительности и встроенной поддержке во многих протоколах и библиотеках. Однако с 2005 года начали появляться криптоаналитические атаки на SHA-1 (коллизионные атаки), что привело к постепенному отказу от HMAC-SHA1 в пользу HMAC-SHA256 и других более стойких алгоритмов. В 2011 году NIST рекомендовал прекратить использование SHA-1 для цифровых подписей, а в 2017 году — для всех криптографических применений, включая HMAC, хотя HMAC-SHA1 остаётся устойчивым к коллизионным атакам в силу своей конструкции.
Принцип работы
HMAC-SHA1 вычисляется по формуле, определённой в RFC 2104:
\[ HMAC(K, m) = H\left( (K' \oplus opad) \parallel H\left( (K' \oplus ipad) \parallel m \right) \right) \]
где:
- \( H \) — хеш-функция (в данном случае SHA-1);
- \( K \) — секретный ключ;
- \( K' \) — ключ, дополненный до длины блока хеш-функции (для SHA-1 блок составляет 64 байта) нулевыми байтами или, если ключ длиннее блока, предварительно хешированный;
- \( ipad \) — внутренняя константа (0x36, повторённая 64 раза);
- \( opad \) — внешняя константа (0x5C, повторённая 64 раза);
- \( m \) — исходное сообщение;
- \( \parallel \) — операция конкатенации;
- \( \oplus \) — операция XOR.
Процесс состоит из двух этапов:
- Внутреннее хеширование: ключ \( K' \) XOR с ipad, затем конкатенация с сообщением \( m \), после чего вычисляется хеш SHA-1.
- Внешнее хеширование: ключ \( K' \) XOR с opad, затем конкатенация с результатом внутреннего хеша, после чего снова вычисляется хеш SHA-1.
Результатом является 160-битное значение (20 байт), которое и является кодом аутентичности сообщения (MAC).
Криптостойкость и безопасность
Устойчивость к коллизиям SHA-1
Основная уязвимость HMAC-SHA1 связана с коллизионной атакой на SHA-1. В 2017 году Google и Centrum Wiskunde & Informatica (CWI) продемонстрировали атаку SHAttered, позволяющую найти коллизию для SHA-1 за эквивалент 110 лет работы одного GPU. Однако HMAC-SHA1 не подвержен прямым коллизионным атакам, так как злоумышленник, не знающий ключа, не может подделать MAC даже при наличии коллизий в SHA-1. Теоретическая стойкость HMAC-SHA1 оценивается как \( 2^{80} \) операций для полного перебора ключа (при длине ключа не менее 80 бит) и \( 2^{160} \) операций для поиска коллизий в самом MAC.
Атаки на ключ
Основная угроза для HMAC-SHA1 — компрометация секретного ключа. Если ключ становится известен злоумышленнику, он может вычислить корректный MAC для любого сообщения. Поэтому ключи должны генерироваться случайным образом и храниться в защищённом окружении. Рекомендуемая длина ключа для HMAC-SHA1 составляет не менее 20 байт (160 бит), хотя стандарт допускает ключи любой длины.
Атаки по сторонним каналам
Как и любой криптографический алгоритм, HMAC-SHA1 может быть уязвим для атак по времени выполнения (timing attacks) или по энергопотреблению. Реализации должны использовать константное время выполнения для всех операций, чтобы предотвратить утечку информации о ключе.
Применение
HMAC-SHA1 широко использовался в различных протоколах и системах, хотя в настоящее время его применение сокращается в пользу более современных алгоритмов.
Протоколы аутентификации и защиты данных
- TLS/SSL (до версии 1.3): HMAC-SHA1 применялся в качестве псевдослучайной функции (PRF) и для аутентификации записей в некоторых наборах шифров (cipher suites). В TLS 1.3 HMAC-SHA1 исключён.
- IPsec: в протоколах AH и ESP HMAC-SHA1 использовался для проверки целостности пакетов.
- SSH: протокол SSH-2 поддерживал HMAC-SHA1 как один из алгоритмов MAC.
- SNMPv3: для аутентификации сообщений в простом протоколе управления сетью.
- DNSSEC: для аутентификации записей DNS.
Аутентификация в веб-приложениях
- OAuth 1.0: для подписи запросов использовался HMAC-SHA1 (наряду с RSA-SHA1). В OAuth 2.0 HMAC-SHA1 не применяется.
- AWS Signature Version 2: Amazon Web Services использовали HMAC-SHA1 для подписи API-запросов (в версии 4 заменён на HMAC-SHA256).
- Cookie-аутентификация: некоторые системы использовали HMAC-SHA1 для создания подписанных cookie.
Проверка целостности данных
- Git: для хеширования объектов Git использует SHA-1, но не HMAC. Однако HMAC-SHA1 применяется в некоторых расширениях Git, например, для аутентификации push-запросов.
- Bitcoin: в некоторых кошельках и протоколах (например, BIP32) используется HMAC-SHA512, но не HMAC-SHA1.
Псевдослучайные функции
HMAC-SHA1 часто используется как основа для генерации псевдослучайных чисел (PRNG) и для вывода ключей (KDF) в различных криптографических библиотеках.
Сравнение с другими алгоритмами HMAC
| Алгоритм | Размер MAC (бит) | Стойкость (бит) | Статус |
|---|---|---|---|
| HMAC-MD5 | 128 | 64 | Устарел (коллизии MD5) |
| HMAC-SHA1 | 160 | 80 | Рекомендуется к замене |
| HMAC-SHA256 | 256 | 128 | Рекомендуется |
| HMAC-SHA512 | 512 | 256 | Рекомендуется |
HMAC-SHA1 обеспечивает стойкость 80 бит, что считается минимально приемлемым для современных приложений, но многие организации требуют не менее 112 бит (например, NIST SP 800-131A). Поэтому HMAC-SHA1 не рекомендуется для новых систем, хотя в legacy-системах он всё ещё встречается.
Примеры реализации
Псевдокод
``` function hmac_sha1(key, message): if length(key) > 64: key = sha1(key) if length(key) < 64: key = key + '\x00' * (64 - length(key))
ipad = '\x36' 64 opad = '\x5C' 64
inner = sha1((key XOR ipad) + message) outer = sha1((key XOR opad) + inner)
return outer ```
Пример на Python (с использованием библиотеки hashlib)
```python import hashlib import hmac
def hmac_sha1(key, message): return hmac.new(key, message, hashlib.sha1).digest() ```
Критика и ограничения
Основная критика HMAC-SHA1 связана с уязвимостью SHA-1 к коллизионным атакам. Хотя HMAC-SHA1 не подвержен этим атакам напрямую, его использование вызывает опасения из-за возможности атак на основе выбранного текста (chosen-plaintext attacks) и атак на основе известного текста (known-plaintext attacks) при определённых условиях. В 2020 году исследователи продемонстрировали атаку на HMAC-SHA1, требующую \( 2^{97} \) запросов к оракулу, что теоретически возможно, но практически нереализуемо при разумных ограничениях.
Дополнительным ограничением является фиксированный размер MAC (160 бит), который может быть избыточным для некоторых приложений, но недостаточным для других (например, для долгосрочного хранения ключей).
Будущее и замена
В настоящее время HMAC-SHA1 считается устаревшим для новых разработок. Основные рекомендации по замене:
- HMAC-SHA256 — стандартный выбор для большинства приложений (обеспечивает 128-битную стойкость).
- HMAC-SHA512 — для систем, требующих повышенной стойкости или работающих на 64-битных архитектурах.
- KMAC (на основе SHA-3) — для новых систем, поддерживающих стандарт SHA-3.
Многие организации, включая NIST и IETF, рекомендуют прекратить использование HMAC-SHA1 в новых протоколах и приложениях, хотя для обратной совместимости он может сохраняться в legacy-системах до 2030 года.
Источники
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication (1997).
- FIPS PUB 198-1 — The Keyed-Hash Message Authentication Code (HMAC) (2008).
- NIST SP 800-131A — Transitioning the Use of Cryptographic Algorithms and Key Lengths (2019).
- Bellare, M., Canetti, R., Krawczyk, H. — Keying Hash Functions for Message Authentication (1996).
- Stevens, M., et al. — The first collision for full SHA-1 (2017).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →