В криптографии HMAC (иногда расширяемый как keyed-hash message authentication code или hash -based message authentication code ) — это особый тип кода аутентификации сообщений (MAC), включающий криптографическую хэш-функцию и секретный криптографический ключ. Как и любой MAC, он может использоваться для одновременной проверки как целостности данных , так и подлинности сообщения. HMAC — это тип keyed hash function, который также может использоваться в схеме вывода ключа или схеме растяжения ключа.
HMAC может обеспечить аутентификацию с использованием общего секрета вместо использования цифровых подписей с асимметричной криптографией . Он компенсирует необходимость в сложной инфраструктуре открытых ключей , делегируя обмен ключами взаимодействующим сторонам, которые отвечают за установление и использование доверенного канала для согласования ключа до начала коммуникации.
Любая криптографическая хэш-функция, например SHA-2 или SHA-3 , может использоваться при вычислении HMAC; полученный алгоритм MAC называется HMAC- x , где x — используемая хэш-функция (например, HMAC-SHA256 или HMAC-SHA3-512). Криптографическая стойкость HMAC зависит от криптографической стойкости базовой хэш-функции, размера ее хэш-вывода, а также размера и качества ключа. [1]
HMAC использует два прохода вычисления хэша. Перед каждым проходом секретный ключ используется для получения двух ключей — внутреннего и внешнего. Затем первый проход алгоритма хэша создает внутренний хэш, полученный из сообщения и внутреннего ключа. Второй проход создает окончательный код HMAC, полученный из результата внутреннего хэша и внешнего ключа. Таким образом, алгоритм обеспечивает лучшую устойчивость к атакам расширения длины .
Итеративная хэш-функция (использующая конструкцию Меркла–Дамгарда ) разбивает сообщение на блоки фиксированного размера и перебирает их с помощью функции сжатия . Например, SHA-256 работает с 512-битными блоками. Размер выходных данных HMAC такой же, как и у базовой хэш-функции (например, 256 и 512 бит в случае SHA-256 и SHA3-512 соответственно), хотя при желании его можно усечь.
HMAC не шифрует сообщение. Вместо этого сообщение (зашифрованное или нет) должно быть отправлено вместе с хешем HMAC. Стороны с секретным ключом снова хешируют сообщение, и если оно подлинное, полученные и вычисленные хеши будут совпадать.
Определение и анализ конструкции HMAC были впервые опубликованы в 1996 году в статье Михира Белларе , Рана Канетти и Хьюго Кравчика , [1] [2] , а также они написали RFC 2104 в 1997 году. [3] : §2 В статье 1996 года также определен вложенный вариант, называемый NMAC (Nested MAC). FIPS PUB 198 обобщает и стандартизирует использование HMAC. [4] HMAC используется в протоколах IPsec , [2] SSH и TLS , а также для JSON Web Tokens .
Это определение взято из RFC 2104:
где
Следующий псевдокод демонстрирует, как может быть реализован HMAC. Размер блока составляет 512 бит (64 байта) при использовании одной из следующих хэш-функций: SHA-1, MD5, RIPEMD-128. [3] : §2
function hmac is input: key: Байты // Массив байтов message: Байты // Массив байтов для хэширования hash: Функция // Используемая хэш-функция (например, SHA-1) blockSize: Целое число // Размер блока хэш-функции (например, 64 байта для SHA-1) outputSize: Целое число // Выходной размер хэш-функции (например, 20 байтов для SHA-1) // Вычислить ключ размера блока block_sized_key = computeBlockSizedKey(ключ, хэш, blockSize) o_key_pad ← block_sized_key xor [0x5c blockSize] // Внешняя клавиша с подкладкой i_key_pad ← block_sized_key xor [0x36 blockSize] // Внутренняя клавиша с подкладкой вернуть хэш(o_key_pad ∥ хэш(i_key_pad ∥ сообщение))Функция computeBlockSizedKey имеет следующие входные данные: key: Байты // Массив байтов hash: Функция // Используемая хэш-функция (например, SHA-1) blockSize: Целое число // Размер блока хэш-функции (например, 64 байта для SHA-1) // Ключи длиннее blockSize укорачиваются путем их хеширования if (length(key) > blockSize) then ключ = хэш(ключ) // Ключи короче blockSize дополняются до blockSize нулями справа if (length(key) < blockSize) then return Pad(key, blockSize) // Дополняем ключ нулями, чтобы сделать его длиной blockSize байт возврат ключа
Разработка спецификации HMAC была мотивирована существованием атак на более тривиальные механизмы объединения ключа с хэш-функцией. Например, можно предположить, что та же безопасность, которую обеспечивает HMAC, может быть достигнута с помощью MAC = H ( ключ ∥ сообщение ). Однако этот метод страдает от серьезного недостатка: с большинством хэш-функций легко добавить данные к сообщению, не зная ключа, и получить другой действительный MAC (« атака с удлинением длины »). Альтернатива, добавление ключа с помощью MAC = H ( сообщение ∥ ключ ), страдает от проблемы, что злоумышленник, который может найти коллизию в (неключевой) хэш-функции, имеет коллизию в MAC (поскольку два сообщения m1 и m2, дающие один и тот же хэш, предоставят одно и то же начальное условие хэш-функции до того, как добавленный ключ будет хэширован, следовательно, конечный хэш будет таким же). Использование MAC = H ( ключ ∥ сообщение ∥ ключ ) является более предпочтительным, однако различные документы по безопасности указывают на уязвимости при таком подходе, даже при использовании двух разных ключей. [1] [7] [8]
Не было обнаружено известных атак расширения против текущей спецификации HMAC, которая определяется как H ( key ∥ H ( key ∥ message )), поскольку внешнее применение хэш-функции маскирует промежуточный результат внутреннего хэша. Значения ipad и opad не являются критическими для безопасности алгоритма, но были определены таким образом, чтобы иметь большое расстояние Хэмминга друг от друга, и поэтому внутренние и внешние ключи будут иметь меньше общих битов. Снижение безопасности HMAC требует, чтобы они отличались хотя бы в одном бите. [ необходима цитата ]
Функция хэширования Keccak , выбранная NIST в качестве победителя конкурса SHA-3 , не нуждается в этом вложенном подходе и может использоваться для генерации MAC путем простого добавления ключа к сообщению, поскольку она не подвержена атакам с удлинением длины. [9]
Криптографическая стойкость HMAC зависит от размера секретного ключа, который используется, и безопасности базовой хэш-функции. Было доказано, что безопасность конструкции HMAC напрямую связана со свойствами безопасности используемой хэш-функции. Наиболее распространенной атакой на HMAC является грубая сила для раскрытия секретного ключа. HMAC значительно меньше подвержены коллизиям, чем их базовые алгоритмы хэширования. [2] [10] [11] В частности, Михир Беллар доказал, что HMAC является псевдослучайной функцией (PRF) при единственном предположении, что функция сжатия является PRF. [12] Следовательно, HMAC-MD5 не страдает от тех же недостатков, которые были обнаружены в MD5. [13]
RFC 2104 требует, чтобы «ключи длиннее B байтов сначала хэшировались с использованием H », что приводит к запутанной псевдоколлизии: если ключ длиннее размера хэш-блока (например, 64 байта для SHA-1), то HMAC(k, m)
вычисляется как HMAC(H(k), m)
. Это свойство иногда упоминается как возможная слабость HMAC в сценариях хэширования паролей: было продемонстрировано, что можно найти длинную строку ASCII и случайное значение, хэш которого также будет строкой ASCII, и оба значения дадут одинаковый вывод HMAC. [14] [15] [16]
В 2006 году Чонсон Ким, Алекс Бирюков , Барт Пренил и Сокхи Хонг показали, как отличить HMAC с сокращенными версиями MD5 и SHA-1 или полными версиями HAVAL , MD4 и SHA-0 от случайной функции или HMAC со случайной функцией. Дифференциальные отличительные признаки позволяют злоумышленнику разработать атаку подделки на HMAC. Кроме того, дифференциальные и прямоугольные отличительные признаки могут привести к атакам второго прообраза . HMAC с полной версией MD4 можно подделать с помощью этих знаний. Эти атаки не противоречат доказательству безопасности HMAC, но дают представление о HMAC на основе существующих криптографических хэш-функций. [17]
В 2009 году Сяоюнь Ван и др. представили различающую атаку на HMAC-MD5 без использования связанных ключей. Она может отличить экземпляр HMAC с MD5 от экземпляра со случайной функцией с 2 97 запросами с вероятностью 0,87. [18]
В 2011 году был опубликован информационный RFC 6151, обобщающий соображения по безопасности в MD5 и HMAC-MD5. Для HMAC-MD5 RFC резюмирует, что – хотя безопасность самой хэш-функции MD5 серьезно скомпрометирована – известные в настоящее время «атаки на HMAC-MD5, похоже, не указывают на практическую уязвимость при использовании в качестве кода аутентификации сообщений» , но также добавляет, что «для новой разработки протокола набор шифров с HMAC-MD5 не должен быть включен» . [13]
В мае 2011 года был опубликован RFC 6234, в котором подробно описана абстрактная теория и исходный код для HMAC на основе SHA. [19]
Вот некоторые значения HMAC, предполагающие 8-битный ASCII для входных данных и шестнадцатеричное кодирование для выходных данных:
HMAC_MD5("key", "Быстрая коричневая лиса перепрыгивает через ленивую собаку") = 80070713463e7749b90c2dc24911e275HMAC_SHA1("ключ", "Быстрая коричневая лиса перепрыгивает через ленивую собаку") = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9HMAC_SHA256("ключ", "Быстрая коричневая лиса перепрыгивает через ленивую собаку") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8HMAC_SHA512("ключ", "Быстрая коричневая лиса перепрыгивает через ленивую собаку") = b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{cite journal}}
: Цитировать журнал требует |journal=
( помощь )В отличие от SHA-1 и SHA-2, Keccak не имеет слабости расширения длины, поэтому не нуждается во вложенной конструкции HMAC. Вместо этого вычисление MAC можно выполнить, просто добавив ключ к сообщению.
хотя это не влияет на приложения, такие как HMAC, где коллизии не важны
Самая сильная известная атака против HMAC основана на частоте коллизий для хэш-функции H («атака дня рождения») [PV,BCK2] и совершенно непрактична для минимально разумных хэш-функций.
В этой статье доказывается, что HMAC является
PRF
при единственном предположении, что функция сжатия является PRF. Это восстанавливает гарантию на основе доказательства, поскольку никакие известные атаки не ставят под угрозу псевдослучайность функции сжатия, а также помогает объяснить устойчивость к атакам, которую HMAC показал даже при реализации с хэш-функциями, чья (слабая) устойчивость к коллизиям скомпрометирована.
{{cite journal}}
: Цитировать журнал требует |journal=
( помощь ){{citation}}
: CS1 maint: numeric names: authors list (link) Информационный. Устаревший RFC 4634. Обновление RFC 3174