Введение
В криптографии, HMAC (иногда расшифровывается как либо «ключевой код аутентификации сообщений на основе хэша», либо «код аутентификации сообщений, основанный на хэше») является специфическим типом кода аутентификации сообщений (MAC), использующим криптографическую хэш-функцию и секретный криптографический ключ. Как и любой MAC, он позволяет одновременно проверять целостность данных и подлинность сообщения. HMAC представляет собой тип хэш-функции с ключом, который также может применяться в схеме генерации ключей или схеме растяжения ключей. HMAC обеспечивает аутентификацию с использованием общего секрета вместо цифровых подписей, основанных на асимметричной криптографии. Он позволяет избежать необходимости в сложной инфраструктуре открытых ключей, передавая задачу обмена ключами взаимодействующим сторонам, которые несут ответственность за установление и использование доверенного канала для согласования ключа перед началом обмена сообщениями.
In cryptography, an HMAC (sometimes expanded as either keyed hash message authentication code or hash based message authentication code) is a specific type of message authentication code (MAC) involving a cryptographic hash function and a secret cryptographic key. As with any MAC, it may be used to simultaneously verify both the data integrity and authenticity of a message. An HMAC is a type of keyed hash function that can also be used in a key derivation scheme or a key stretching scheme. HMAC can provide authentication using a shared secret instead of using digital signatures with asymmetric cryptography. It trades off the need for a complex public key infrastructure by delegating the key exchange to the communicating parties, who are responsible for establishing and using a trusted channel to agree on the key prior to communication.
Принципы проектирования
Разработка спецификации HMAC была обусловлена существованием атак на более простые механизмы объединения ключа с хэш-функцией. Например, можно предположить, что аналогичный уровень безопасности, обеспечиваемый HMAC, можно достичь с помощью MAC = H(ключ || сообщение). Однако этот метод имеет серьезный недостаток: для большинства хэш-функций легко добавить данные к сообщению, не зная ключа, и получить другой допустимый MAC ("атака на расширение длины"). Альтернативный вариант, добавление ключа с помощью MAC = H(сообщение || ключ), страдает от проблемы, что злоумышленник, способный найти коллизию в (неключевой) хэш-функции, сможет найти коллизию и в MAC (поскольку два сообщения m1 и m2, дающие одинаковый хэш, предоставят хэш-функции одно и то же начальное состояние перед хэшированием добавленного ключа, а значит, итоговый хэш будет одинаковым). Использование MAC = H(ключ || сообщение || ключ) лучше, но в различных работах по безопасности указываются уязвимости этого подхода, даже при использовании двух разных ключей. В текущей спецификации HMAC, определяемой как H(ключ || H(ключ || сообщение)), неизвестно атак на расширение длины, поскольку внешнее применение хэш-функции маскирует промежуточный результат внутренней хэш-функции. Значения ipad и opad не критичны для безопасности алгоритма, но были определены таким образом, чтобы иметь большое расстояние Хэмминга друг от друга, и, следовательно, внутренний и внешний ключи имели меньше общих битов. Безопасность HMAC требует, чтобы они отличались хотя бы в одном бите. Хэш-функция Keccak, выбранная NIST в качестве победителя конкурса SHA 3, не нуждается в этом вложенном подходе и может использоваться для генерации MAC, просто добавляя ключ к началу сообщения, поскольку она не подвержена атакам на расширение длины.
Безопасность
Криптографическая стойкость HMAC зависит от размера используемого секретного ключа и безопасности лежащей в основе хэш-функции. Доказано, что безопасность конструкции HMAC напрямую связана со свойствами безопасности используемой хэш-функции. Наиболее распространенная атака на HMAC — это перебор для раскрытия секретного ключа. HMAC значительно менее подвержен коллизиям, чем используемые в его основе алгоритмы хеширования. В частности, Михир Белларе доказал, что HMAC является псевдослучайной функцией (PRF) при единственном условии, что функция сжатия является PRF. Следовательно, HMAC MD5 не страдает от тех же недостатков, которые были обнаружены в MD5. RFC 2104 требует, чтобы "ключи длиной более B байт сначала хешировались с использованием H", что приводит к запутанной псевдоколлизии: если ключ длиннее размера хэш-блока (например, 64 байта для SHA-1), то HMAC(k, m) вычисляется как HMAC(H(k), m). Это свойство иногда рассматривается как потенциальная слабость HMAC в сценариях хеширования паролей: было продемонстрировано, что можно найти длинную ASCII-строку и случайное значение, хеш которых также будет ASCII-строкой, и оба значения будут давать одинаковый результат HMAC. В 2006 году Jongsung Kim, Alex Biryukov, Bart Preneel и Seokhie Hong показали, как отличить HMAC с усеченными версиями MD5 и SHA-1 или полными версиями HAVAL, MD4 и SHA-0 от случайной функции или HMAC с случайной функцией. Дифференциальные отличители позволяют злоумышленнику разработать атаку подделки на HMAC. Кроме того, дифференциальные и прямоугольные отличители могут привести к атакам по второму прообразу. HMAC с полной версией MD4 может быть подделан, используя эти знания. Эти атаки не противоречат доказательству безопасности HMAC, но дают представление о HMAC на основе существующих криптографических хэш-функций. В 2009 году Xiaoyun Wang и др. представили атаку различия на HMAC MD5 без использования связанных ключей. Она может отличить реализацию HMAC с MD5 от реализации со случайной функцией с 297 запросами с вероятностью 0,87. В 2011 году был опубликован информационный RFC 6151, в котором обобщены соображения безопасности в MD5 и HMAC MD5. Для HMAC MD5 RFC заключает, что, хотя безопасность самой хэш-функции MD5 серьезно скомпрометирована, известные в настоящее время "атаки на HMAC MD5 не указывают на практическую уязвимость при использовании в качестве кода аутентификации сообщений", но также добавляет, что "при разработке нового протокола набор шифров с HMAC MD5 не следует включать".