HMAC-SHA256
HMAC-SHA256 (Hash-Based Message Authentication Code with SHA-256) — это криптографический алгоритм, предназначенный для проверки целостности и подлинности данных, а также для аутентификации сообщений. Он представляет собой реализацию механизма HMAC (RFC 2104) с использованием хеш-функции SHA-256 (Secure Hash Algorithm 2 с длиной дайджеста 256 бит). HMAC-SHA256 позволяет двум сторонам, обладающим общим секретным ключом, убедиться, что передаваемое сообщение не было изменено в пути и что оно исходит от доверенного отправителя. Алгоритм широко применяется в протоколах безопасности, API-аутентификации, электронной подписи и системах контроля целостности данных.
История и стандартизация
Концепция HMAC была впервые предложена исследователями Михиром Белларом, Раном Канетти и Хьюго Кравчиком в 1996 году. В том же году алгоритм был опубликован в виде интернет-стандарта RFC 2104 (HMAC: Keyed-Hashing for Message Authentication). В качестве базовой хеш-функции в стандарте допускается использование любой криптостойкой хеш-функции, в том числе SHA-256.
SHA-256 был разработан Агентством национальной безопасности США (NSA) и опубликован Национальным институтом стандартов и технологий США (NIST) в 2001 году как часть семейства SHA-2. С 2002 года SHA-256 является официальным федеральным стандартом США (FIPS PUB 180-2). Сочетание HMAC и SHA-256 (HMAC-SHA256) получило широкое распространение благодаря устойчивости SHA-256 к коллизиям и высокой вычислительной эффективности.
Принцип работы
Общая схема HMAC
HMAC-SHA256 строится на основе итеративного применения хеш-функции SHA-256 к сообщению и секретному ключу. Формально алгоритм описывается формулой:
`` HMAC(K, m) = H( (K' ⊕ opad) || H( (K' ⊕ ipad) || m ) ) ``
где:
- K — секретный ключ;
- K' — ключ, приведённый к длине блока хеш-функции (для SHA-256 — 64 байта) путём дополнения нулями или хеширования, если исходный ключ длиннее блока;
- ipad — внутренняя константа (0x36, повторённая 64 раза);
- opad — внешняя константа (0x5C, повторённая 64 раза);
- ⊕ — операция XOR (исключающее ИЛИ);
- || — конкатенация (объединение последовательностей байтов);
- H — хеш-функция SHA-256;
- m — исходное сообщение.
Этапы вычисления
- Подготовка ключа. Если длина ключа K превышает 64 байта, он хешируется с помощью SHA-256, и результат используется как новый ключ. Если ключ короче 64 байт, он дополняется нулевыми байтами до длины 64 байта.
- Вычисление внутреннего хеша. Ключ XOR-ится с константой ipad, затем к результату дописывается исходное сообщение m, и вся последовательность хешируется с помощью SHA-256. Получается промежуточный дайджест (32 байта).
- Вычисление внешнего хеша. Ключ XOR-ится с константой opad, затем к результату дописывается промежуточный дайджест, и вся последовательность снова хешируется с помощью SHA-256. Результат — итоговый код аутентификации сообщения (HMAC) длиной 32 байта (256 бит).
Характеристики и свойства
Длина выходного значения
Выходное значение HMAC-SHA256 имеет фиксированную длину — 256 бит (32 байта). В отличие от простого хеширования, HMAC не является хеш-функцией в чистом виде, так как зависит от секретного ключа.
Криптостойкость
Безопасность HMAC-SHA256 основана на двух факторах:
- Стойкость хеш-функции SHA-256 к коллизиям (нахождению двух различных сообщений с одинаковым дайджестом) и к прообразам (восстановлению исходного сообщения по дайджесту). На 2025 год SHA-256 считается криптостойким и не имеет известных практических уязвимостей.
- Секретность ключа. Если злоумышленник не знает ключ, он не может вычислить корректный HMAC для произвольного сообщения. Даже при наличии большого количества пар (сообщение, HMAC) восстановить ключ вычислительно невозможно.
Длина ключа
Рекомендуемая длина ключа для HMAC-SHA256 составляет не менее 256 бит (32 байта). Более короткие ключи снижают стойкость алгоритма. Ключи длиннее 64 байт автоматически хешируются, что уменьшает их эффективную длину до 256 бит.
Применение
Аутентификация в API
HMAC-SHA256 широко используется для подписи запросов в REST API и веб-сервисах. Например, в протоколах Amazon AWS Signature Version 4, Google Cloud API и многих других системах. Клиент вычисляет HMAC от тела запроса, заголовков и других параметров, используя секретный ключ, и передаёт результат в заголовке запроса. Сервер, зная ключ, повторяет вычисление и сравнивает результат.
Протоколы безопасности
- TLS/SSL. В некоторых реализациях протокола TLS (например, в шифровальных наборах с HMAC) HMAC-SHA256 используется для аутентификации записей.
- IPsec. В протоколе IPsec HMAC-SHA256 применяется для аутентификации пакетов в режиме AH (Authentication Header) и ESP (Encapsulating Security Payload).
- SSH. Протокол Secure Shell поддерживает HMAC-SHA256 для проверки целостности передаваемых данных.
Электронная подпись и блокчейн
HMAC-SHA256 используется в некоторых криптовалютах и блокчейн-системах для генерации ключей и подписи транзакций. Например, в алгоритме BIP32 (иерархические детерминированные кошельки) HMAC-SHA512 применяется для генерации дочерних ключей.
Контроль целостности файлов
В системах резервного копирования и распространения программного обеспечения HMAC-SHA256 может использоваться для проверки того, что файл не был изменён злоумышленником или повреждён при передаче.
Примеры использования
Пример 1: Аутентификация запроса к API
Предположим, клиент отправляет POST-запрос на сервер с телом {"user": "alice", "action": "login"}. Секретный ключ — my_secret_key. Клиент вычисляет HMAC-SHA256 от конкатенации метода запроса, пути, тела и временной метки:
`` HMAC-SHA256("my_secret_key", "POST/api/login{\"user\":\"alice\",\"action\":\"login\"}2025-01-01T12:00:00Z") ``
Результат (в шестнадцатеричном представлении): a1b2c3d4e5f67890... (32 байта). Этот код добавляется в заголовок Authorization. Сервер, зная ключ, повторяет вычисление и сравнивает.
Пример 2: Проверка целостности сообщения
Два пользователя обмениваются сообщениями через незащищённый канал. Они заранее договорились о секретном ключе shared_key. Отправитель вычисляет HMAC-SHA256 от текста сообщения и прикладывает его к сообщению. Получатель, получив сообщение, повторно вычисляет HMAC и сравнивает с полученным значением. Если они совпадают, сообщение не было изменено.
Сравнение с другими алгоритмами
| Алгоритм | Длина выхода | Скорость (относительно) | Криптостойкость (на 2025 г.) |
|---|---|---|---|
| HMAC-MD5 | 128 бит | Высокая | Низкая (известны коллизии) |
| HMAC-SHA1 | 160 бит | Высокая | Средняя (атаки на SHA-1) |
| HMAC-SHA256 | 256 бит | Средняя | Высокая |
| HMAC-SHA512 | 512 бит | Низкая | Высокая |
| HMAC-SHA3-256 | 256 бит | Средняя | Высокая (новый стандарт) |
HMAC-SHA256 является сбалансированным выбором между производительностью и безопасностью, что делает его наиболее распространённым вариантом в современных системах.
Критика и ограничения
- Зависимость от ключа. Безопасность HMAC-SHA256 полностью зависит от сохранности секретного ключа. Если ключ скомпрометирован, злоумышленник может подделывать любые сообщения.
- Отсутствие шифрования. HMAC-SHA256 не шифрует данные, а только аутентифицирует их. Для обеспечения конфиденциальности необходимо использовать дополнительное шифрование (например, AES).
- Уязвимость к атакам по времени. В некоторых реализациях сравнение HMAC может выполняться побайтово, что позволяет злоумышленнику проводить атаку по времени для подбора корректного кода. Для защиты применяется сравнение за константное время.
- Ограничение длины ключа. При использовании ключей длиннее 64 байт они хешируются, что снижает эффективную длину ключа до 256 бит. Это не является проблемой для большинства приложений, но может быть неудобно при работе с очень длинными ключами.
Источники
- RFC 2104 — HMAC: Keyed-Hashing for Message Authentication (1997)
- FIPS PUB 180-4 — Secure Hash Standard (SHS) (2015)
- NIST Special Publication 800-107 — Recommendation for Applications Using Approved Hash Algorithms (2012)
- Беллар М., Канетти Р., Кравчик Х. — Keying Hash Functions for Message Authentication (1996)
- Стандарт SHA-2 — ANSI X9.31
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →