Открыть сервис

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) вычисляется следующим образом:

  1. Если длина ключа K больше длины блока хеш-функции (обычно 64 байта для MD5 и SHA-1, 128 байт для SHA-256), то K сначала хешируется, и результат используется как новый ключ.
  2. Ключ дополняется нулями до длины блока хеш-функции, получая K'.
  3. Вычисляется внутренний хеш: H((K' ⊕ ipad) || m), где ipad — повторяющийся байт 0x36, а || обозначает конкатенацию.
  4. Вычисляется внешний хеш: H((K' ⊕ opad) || H((K' ⊕ ipad) || m)), где opad — повторяющийся байт 0x5C.

Результат — дайджест фиксированной длины (зависит от используемой хеш-функции). Такая конструкция защищает от атак на основе удлинения сообщения (length extension attack), уязвимых для некоторых хеш-функций (например, MD5, SHA-1, SHA-2).

Классификация и варианты

По используемой хеш-функции

По области применения

Свойства и криптостойкость

Безопасность HMAC основана на стойкости используемой хеш-функции и секретности ключа. При условии, что хеш-функция удовлетворяет требованиям криптографической стойкости (устойчивость к коллизиям, необратимость), HMAC считается защищённым от атак подбора ключа (brute-force) и атак на основе известного текста. Длина ключа обычно составляет от 128 до 512 бит; NIST рекомендует ключи длиной не менее 128 бит для HMAC-SHA256.

Основные атаки на HMAC:

Применение

HMAC широко используется в современных криптографических протоколах и системах:

Реализации

HMAC реализован во всех основных криптографических библиотеках: OpenSSL, GnuTLS, Crypto++ (C++), Bouncy Castle (Java), PyCrypto (Python), .NET Cryptography (C#), libsodium (C). В операционных системах HMAC доступен через системные криптографические API (например, Windows CryptoAPI, macOS Security Framework).

Критика и ограничения

Основные недостатки HMAC:

В 2010-х годах были предложены альтернативы, такие как KMAC (Keccak Message Authentication Code) на основе SHA-3, которые устраняют некоторые ограничения HMAC, но HMAC остаётся наиболее распространённым стандартом.

Источники:

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →