Когда безопасно использовать сломанную хеш-функцию?

Тривиально использовать безопасную хеш-функцию, такую ​​как SHA-256, и продолжать использовать MD5 для безопасности - это безрассудное поведение. Тем не менее, есть некоторые сложности, связанные с уязвимостями хеш-функций, которые я хотел бы лучше понять.

Столкновения были созданы для MD4 и MD5. Согласно NIST, MD5 не является безопасной хеш-функцией. Для создания коллизии требуется всего 2 39 операций, и их никогда не следует использовать для паролей. Однако SHA-1 уязвим к аналогичной атаке столкновения, в которой столкновение может быть найдено в 2 69 операциях, тогда как грубая сила составляет 2 80. Никто не генерировал коллизию SHA-1, и NIST по-прежнему перечисляет SHA-1 в качестве защищенной функции дайджеста сообщений.

Так когда же безопасно использовать сломанную хеш-функцию? Даже если функция нарушена, она все равно может быть "достаточно большой". Согласно Шнайеру, хеш-функция, уязвимая к атаке столкновений, все еще может использоваться как HMAC. Я полагаю, что это потому, что безопасность HMAC зависит от его секретного ключа, и коллизия не может быть найдена, пока этот ключ не получен. Как только у вас есть ключ, используемый в HMAC, он уже сломан, так что это спорный вопрос. Какие уязвимости хеш-функции могут подорвать безопасность HMAC?

Давайте возьмем это свойство немного дальше. Тогда станет ли безопасным использование очень слабого дайджеста сообщений, такого как MD4, для паролей, если перед паролем будет добавлена ​​соль? Имейте в виду, что атаки MD4 и MD5 являются атаками с префиксами, и, если перед ними стоит соль, злоумышленник не может контролировать префикс сообщения. Если соль действительно является секретом и не известна злоумышленнику, то имеет ли значение, добавлена ​​ли она к паролю? Можно ли предположить, что злоумышленник не может создать столкновение, пока не будет получено все сообщение?

Знаете ли вы о других случаях, когда сломанная хеш-функция может использоваться в контексте безопасности, не создавая уязвимости?

(Пожалуйста, опубликуйте подтверждающие доказательства, потому что это здорово!)

6 ответов

Решение

На самом деле коллизии проще, чем то, что вы перечисляете как в MD5, так и в SHA-1. Столкновения MD5 могут быть обнаружены во времени, эквивалентном 226,5 операции (где одна "операция" - это вычисление MD5 по короткому сообщению). См. Эту страницу для получения дополнительной информации и реализации атаки (я написал этот код; он обнаруживает столкновение в среднем в течение 14 секунд на 2,4 ГГц Core2 x86 в 64-битном режиме).

Точно так же самая известная атака на SHA-1 - примерно 261 операция, а не 269. Это все еще теоретическое (фактическое столкновение еще не было произведено), но оно находится в пределах возможного.

Что касается последствий для безопасности: обычно говорят, что хэш-функции имеют три свойства:

  • Без прообраза: учитывая y, не должно быть возможным найти x такой, что h (x) = y.
  • Никакого второго прообраза: при заданном x1 не должно быть возможным найти x2 (отличный от x1) такой, что h (x1) = h (x2).
  • Нет столкновения: не должно быть возможным найти какие-либо x1 и x2 (отличные друг от друга), такие что h (x1) = h (x2).

Для хеш-функции с n- битным выходом существуют общие атаки (которые работают независимо от деталей хэш-функции) в 2n операций для двух первых свойств и 2n / 2 операций для третьего. Если для заданной хеш-функции обнаружена атака, которая, используя специальные подробности о том, как работает хеш-функция, находит прообраз, второе прообраз или столкновение быстрее, чем соответствующая общая атака, то хеш-функция называется быть сломанным".

Однако не все виды использования хеш-функций зависят от всех трех свойств. Например, цифровые подписи начинаются с хеширования данных, которые должны быть подписаны, а затем значение хеш-функции используется в остальной части алгоритма. Это зависит от устойчивости к прообразам и вторым прообразам, но на цифровые подписи как таковые не влияют столкновения. Коллизии могут быть проблемой в некоторых конкретных сценариях подписи, когда злоумышленник выбирает данные, которые должны быть подписаны жертвой (в основном, злоумышленник вычисляет коллизию, получает одно сообщение, подписанное жертвой, и подпись становится действительной для другое сообщение также). Этому можно противодействовать, добавляя несколько случайных байтов к подписанному сообщению перед вычислением подписи (атака и решение, продемонстрированное в контексте сертификатов X.509).

Безопасность HMAC зависит от другого свойства, которое должна выполнять хэш-функция; а именно, что "функция сжатия" (элементарный блок, на котором построена хэш-функция) действует как псевдослучайная функция (PRF). Детали того, что такое PRF, довольно технические, но, грубо говоря, PRF должны быть неотличимы от Случайного Оракула. Случайный оракул моделируется как черный ящик с гномом, несколькими кубиками и большой книгой. На некоторых входных данных гном выбирает случайный выход (с кубиками) и записывает в книгу входное сообщение и выход, который был выбран случайным образом. Гном использует книгу, чтобы проверить, видел ли он уже то же входное сообщение: если это так, то гном возвращает тот же вывод, что и ранее. По построению вы ничего не можете знать о выводе случайного оракула для данного сообщения, пока не попробуете.

Модель случайного оракула позволяет количественно определить доказательство безопасности HMAC в вызовах PRF. В основном, доказательство утверждает, что HMAC не может быть нарушен без вызова PRF огромное количество раз, и под "огромным" я имею в виду вычислительно невозможное.

К сожалению, у нас нет случайных оракулов, поэтому на практике мы должны использовать хеш-функции. Нет никаких доказательств того, что хеш-функции действительно существуют со свойством PRF; прямо сейчас у нас есть только кандидаты, то есть функции, для которых мы не можем доказать (пока), что их функции сжатия не являются PRF.

Если функция сжатия является PRF, то хеш-функция автоматически устойчива к столкновениям. Это часть магии PRF. Поэтому, если мы можем найти столкновения для хэш-функции, то мы знаем, что функция внутреннего сжатия не является PRF. Это не превращает столкновения в атаку на HMAC. Возможность генерировать коллизии по своему желанию не помогает сломать HMAC. Однако эти коллизии демонстрируют, что доказательство безопасности, связанное с HMAC, не применяется. Гарантия недействительна. Это то же самое, что портативный компьютер: открытие корпуса не обязательно сломает машину, но после этого вы останетесь один.

В статье Kim-Biryukov-Preneel-Hong представлены некоторые атаки на HMAC, в частности, подделка HMAC-MD4. Атака использует недостатки MD4 (его "слабости"), которые делают его не PRF. Варианты с теми же слабостями использовались для генерации коллизий на MD4 (MD4 полностью сломан; некоторые атаки генерируют коллизии быстрее, чем вычисление самой хеш-функции!). Таким образом, столкновения не подразумевают атаку HMAC, но обе атаки используют один и тот же источник. Тем не менее, обратите внимание, что атака подделки обошлась в 258, что довольно высоко (фактическая подделка не производилась, результат все еще теоретический), но существенно ниже, чем уровень сопротивления, ожидаемый от HMAC (с надежной хэш-функцией с n- Выходной бит, HMAC должен выдерживать до 2n рабочего фактора; n = 128 для MD4).

Таким образом, хотя коллизии сами по себе не означают слабых мест в HMAC, они являются плохой новостью. На практике коллизии являются проблемой для очень немногих установок. Но знать, влияют ли коллизии на данное использование хеш-функций, достаточно сложно, поэтому совершенно неразумно продолжать использовать хеш-функцию, для которой были продемонстрированы коллизии.

Для SHA-1 атака все еще является теоретической, и SHA-1 широко развернут. Ситуация описана так: "Сигнализация включена, но нет видимого огня или дыма. Пора идти к выходу, но не бежать".

Для получения дополнительной информации по этому вопросу начните с прочтения главы 9 " Руководства по прикладной криптографии" Менезеса, ван Ооршота и Ванстоуна, которую обязательно нужно прочитать начинающему криптографу (не путать с "Прикладной криптографией" Б. Шнейера)., что является хорошо написанным введением, но нигде не так обстоятельно, как "Справочник").

Единственный случай, когда безопасно использовать сломанную хеш-функцию, - это когда последствия столкновения безвредны или тривиальны, например, при назначении файлов в корзину в файловой системе.

Сайты загрузки используют хэш MD5 в качестве контрольной суммы, чтобы определить, был ли файл поврежден во время загрузки, и я бы сказал, что сломанный хэш достаточно хорош для этой цели.

Допустим, MITM решает изменить файл (например, zip-архив или exe-файл). Теперь злоумышленник должен сделать две вещи -

  1. Найдите коллизию хешей и создайте из нее измененный файл
  2. Убедитесь, что вновь созданный файл также является допустимым exe-файлом или zip-архивом.

С битым хешем 1 немного проще. Но обеспечение того, что столкновение одновременно отвечает другим известным свойствам файла, является слишком дорогим в вычислительном отношении.

Это полностью мой собственный ответ, и я могу быть ужасно неправ.

Когда вам все равно, безопасно это или нет.

Серьезно, не требуется никаких дополнительных усилий для использования безопасной хеш-функции практически на всех языках, а влияние на производительность незначительно, поэтому я не понимаю, почему вы этого не сделаете.

[Изменить после прочтения вашего вопроса]

Согласно Шнайеру, хеш-функция, уязвимая к атаке столкновений, все еще может использоваться как HMAC. Я полагаю, что это потому, что безопасность HMAC зависит от его секретного ключа, и коллизия не может быть найдена, пока этот ключ не получен.

На самом деле, это в основном потому, что возможность генерировать коллизию для хеша не обязательно помогает вам генерировать коллизию для хеш- кода (в сочетании с XORing, используемым HMAC).

Тогда станет ли безопасным использование очень слабого дайджеста сообщений, такого как md4, для паролей, если к паролю добавлена ​​соль?

Нет, если у хеша есть атака прообраза, которая позволяет вам добавлять данные к входу. Например, если хеш был H(pass + salt)нам нужна предварительная атака, которая позволяет нам найти pass2 такой, что H(pass2 + salt) = H(pass + salt),

В прошлом были атаки с добавлением, так что я уверен, что возможны атаки с предварительной подготовкой.

Ответ полностью зависит от того, для чего вы его используете. Если вам нужно предотвратить столкновение с несколькими миллисекундами, я бы беспокоился меньше, чем если бы вам нужно было предотвратить столкновение в течение нескольких десятилетий.

Какую проблему вы на самом деле пытаетесь решить?

Большая часть беспокойства по поводу использования чего-то вроде MD4 для пароля связана не столько с известными в настоящее время атаками, сколько с тем фактом, что после того, как он проанализирован до такой степени, что генерация коллизий проста, обычно считается, что кто-то значительно сможет использовать эти знания для создания прообразной атаки - и когда / если это произойдет, практически все возможные варианты использования этой хэш-функции станут уязвимыми.

Другие вопросы по тегам