HMAC
В криптографии HMAC код аутентификации сообщения на основе (иногда расширяемый как код аутентификации сообщения с хеш-ключом или хэша ) представляет собой особый тип кода аутентификации сообщения (MAC), включающий криптографическую хеш-функцию и секретный криптографический ключ. Как и любой MAC, его можно использовать для одновременной проверки целостности данных и подлинности сообщения. HMAC — это тип хеш-функции с ключом, которую также можно использовать в схеме получения ключей или схеме растяжения ключей.
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] В документе 1996 года также определен вложенный вариант под названием NMAC (Nested MAC). FIPS PUB 198 обобщает и стандартизирует использование HMAC. [4] HMAC используется в IPsec , [2] Протоколы SSH и TLS , а также веб-токены JSON .
Определение
[ редактировать ]Это определение взято из RFC 2104:
где
- — это криптографическая хэш-функция.
- это сообщение, которое необходимо аутентифицировать.
- это секретный ключ.
- — ключ размером с блок, полученный из секретного ключа K ; либо путем заполнения справа нулями до размера блока, либо путем хеширования до значения, меньшего или равного размеру блока, а затем заполнения справа нулями.
- обозначает конкатенацию .
- обозначает побитовое исключающее или (XOR).
- — это внешнее заполнение размером с блок, состоящее из повторяющихся байтов со значением 0x5c.
- — это внутреннее заполнение размером с блок, состоящее из повторяющихся байтов со значением 0x36. [3]
Хэш-функция H
|
b , байты
|
L , байты
|
---|---|---|
MD5 | 64 | 16 |
ША-1 | 64 | 20 |
ША-224 | 64 | 28 |
ША-256 | 64 | 32 |
ША-512/224 | 128 | 28 |
ША-512/256 | 128 | 32 |
ША-384 | 128 | 48 |
ША-512 | 128 | 64 [5] |
SHA3-224 | 144 | 28 |
SHA3-256 | 136 | 32 |
SHA3-384 | 104 | 48 |
SHA3-512 | 72 | 64 [6] |
out = H( in ) [3]
|
Выполнение
[ редактировать ]Следующий псевдокод демонстрирует, как можно реализовать HMAC. Размер блока составляет 512 бит (64 байта) при использовании одной из следующих хеш-функций: SHA-1, MD5, RIPEMD-128. [3]
function hmac is input: key: Bytes // Array of bytes message: Bytes // Array of bytes to be hashed hash: Function // The hash function to use (e.g. SHA-1) blockSize: Integer // The block size of the hash function (e.g. 64 bytes for SHA-1) outputSize: Integer // The output size of the hash function (e.g. 20 bytes for SHA-1) // Compute the block sized key block_sized_key = computeBlockSizedKey(key, hash, blockSize) o_key_pad ← block_sized_key xor [0x5c blockSize] // Outer padded key i_key_pad ← block_sized_key xor [0x36 blockSize] // Inner padded key return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) function computeBlockSizedKey is input: key: Bytes // Array of bytes hash: Function // The hash function to use (e.g. SHA-1) blockSize: Integer // The block size of the hash function (e.g. 64 bytes for SHA-1) // Keys longer than blockSize are shortened by hashing them if (length(key) > blockSize) then key = hash(key) // Keys shorter than blockSize are padded to blockSize by padding with zeros on the right if (length(key) < blockSize) then return Pad(key, blockSize) // Pad key with zeros to make it blockSize bytes long return key
Принципы проектирования
[ редактировать ]Разработка спецификации 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", "The quick brown fox jumps over the lazy dog") = 80070713463e7749b90c2dc24911e275 HMAC_SHA1("key", "The quick brown fox jumps over the lazy dog") = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 HMAC_SHA512("key", "The quick brown fox jumps over the lazy dog") = b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a
Ссылки
[ редактировать ]- ^ Jump up to: а б с Белларе, Михир ; Канетти, Ран; Кравчик, Хью (1996). «Ключевые хэш-функции для аутентификации сообщений»: 1–15. CiteSeerX 10.1.1.134.8430 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Jump up to: а б с Белларе, Михир; Канетти, Ран; Кравчик, Хьюго (весна 1996 г.). «Аутентификация сообщений с использованием хеш-функций — конструкция HMAC» (PDF) . Криптобайты . 2 (1).
- ^ Jump up to: а б с д «Определение HMAC» . HMAC: хеширование ключей для аутентификации сообщений . сек. 2. дои : 10.17487/RFC2104 . РФК 2104 .
- ^ «FIPS 198-1: Код аутентификации сообщения с использованием хэш-ключа (HMAC)» . Федеральные стандарты обработки информации . 16 июля 2008 г.
- ^ «FIPS 180-2 с уведомлением об изменении 1» (PDF) . csrc.nist.gov .
- ^ Дворкин, Моррис (4 августа 2015 г.). «Стандарт SHA-3: хеширование на основе перестановок и функции расширяемого вывода» . Федеральные стандарты обработки информации – через публикации NIST.
- ^ Пренил, Барт ; ван Оршот, Пол К. (1995). «MDx-MAC и построение быстрых MAC из хэш-функций». CiteSeerX 10.1.1.34.3855 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Пренил, Барт ; ван Оршот, Пол К. (1995). «О безопасности двух MAC-алгоритмов». CiteSeerX 10.1.1.42.8908 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Команда Кечак. «Команда Keccak – Дизайн и безопасность» . Проверено 31 октября 2019 г.
В отличие от SHA-1 и SHA-2, Keccak не имеет недостатка расширения длины и, следовательно, не нуждается во вложенной конструкции HMAC. Вместо этого вычисление MAC можно выполнить, просто добавив к сообщению ключ.
- ^ Шнайер, Брюс (август 2005 г.). «SHA-1 сломан» . Проверено 9 января 2009 г.
хотя это не влияет на такие приложения, как HMAC, где коллизии не важны
- ^ IETF (февраль 1997 г.). "Безопасность" . HMAC: хеширование ключей для аутентификации сообщений . сек. 6. дои : 10.17487/RFC2104 . РФК 2104 . Проверено 3 декабря 2009 г.
Самая сильная известная атака на HMAC основана на частоте коллизий хеш-функции H («атака дня рождения») [PV,BCK2] и совершенно непрактична для минимально разумных хеш-функций.
- ^ Белларе, Михир. «Новые доказательства для NMAC и HMAC: безопасность без устойчивости к столкновениям» (PDF) . Журнал криптологии . Проверено 15 декабря 2021 г.
В этой статье доказывается, что HMAC является PRF при единственном предположении, что функция сжатия является PRF. Это восстанавливает гарантию, основанную на доказательствах, поскольку никакие известные атаки не ставят под угрозу псевдослучайность функции сжатия, а также помогает объяснить устойчивость к атакам, которую HMAC продемонстрировал даже при реализации с хеш-функциями, чья (слабая) устойчивость к коллизиям скомпрометирована.
- ^ Jump up to: а б Тернер, Шон (март 2011 г.). «RFC 6151 — Обновленные соображения безопасности для дайджеста сообщений MD5 и алгоритмов HMAC-MD5» . Рабочая группа по интернет-инжинирингу . Проверено 15 июня 2015 г.
- ^ «Объяснение коллизий хэшей PBKDF2+HMAC · Матиас Байненс» . mathiasbynens.be . Проверено 7 августа 2019 г.
- ^ «Аарон Топонсе: Взлом HMAC» . Проверено 7 августа 2019 г.
- ^ «Ошибки в RFC 2104 задержаны для обновления документа · Эрдем Мемисязычи» . www.rfc-editor.org . Проверено 23 сентября 2016 г.
- ^
Чонсон, Ким; Бирюков, Алекс; Пренил, Барт; Хонг, Сохи (2006). «О безопасности HMAC и NMAC на основе HAVAL, MD4, MD5, SHA-0 и SHA-1» (PDF) .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^
Ван, Сяоюнь; Ю, Хунбо; Ван, Вэй; Чжан, Хайна; Чжан, Тао (2009). «Криптоанализ HMAC/NMAC-MD5 и MD5-MAC» (PDF) . Проверено 15 июня 2015 г.
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) - ^ Истлейк 3-й, Д.; Хансен, Т. (май 2011 г.). «Алгоритмы безопасного хэширования США (SHA и HMAC и HKDF на основе SHA)» . дои : 10.17487/RFC6234 . ISSN 2070-1721 .
{{cite journal}}
: Для цитирования журнала требуется|journal=
( помощь ) CS1 maint: числовые имена: список авторов ( ссылка )