Найдите $ secret в $ a == md5 ($ b. $ Secret) - PullRequest
7 голосов
/ 24 апреля 2011

Функция:

$a == md5($b . $secret);
  • Вы можете выбрать $ a и $ b
  • Вы не знаете $ secret
  • Вы получаете значениефункции для $ a и $ b, которые вы выбираете как true или false.

Есть ли какая-нибудь лучшая атака, чем грубая сила, чтобы найти $ secret вообще?Есть ли лучшая атака, чем грубая сила, чтобы найти $ secret, используя PHP-функцию md5 ?

Из того, что я нашел в Интернете, я думаю, что нет, хотя md5 устарела длянекоторые другие варианты использования.Так что просто чтобы быть уверенным ...

С уважением

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011

Это интересный вопрос, потому что в типичных сценариях в IT-Security вы не можете выбрать $a и $b в качестве атакующего. Например, если вы можете получить хешированный пароль, $a и $b уже определены, и вам придется работать с этим. В этом случае вы можете использовать брут-форс или радужный стол, только если есть стол с солью $b.

В вашем примере, с другой стороны, вы можете выбрать оба значения. Вы можете взять произвольный секрет, например, test и выберите значения для $a и $b соответственно. Я выбираю $ b как empty string и вычисляю $a с $a = md5($secret), что приводит к 098f6bcd4621d373cade4e832627b4f6.

Я выбираю $a = "098f6bcd4621d373cade4e832627b4f6" и $b= "" и спрашиваю, если $secret == "test". Вы говорите правду, а я говорю, что проблема решена.

Это наконец приводит нас к реальному ответу. Два условия даны

  • Вы можете выбрать $ a и $ b
  • Вы не знаете $ secret

не работают вместе. В моем примере я определил $secret сам. Я нарушил второе условие. С другой стороны, я не могу выбрать $a и $b произвольно, не выводя их из $secret, потому что они могут не иметь решения.

Если мы предположим, что есть хотя бы одно решение для всех возможных пар $a и $b (может быть, есть доказательства для этого, я не знаю), и вы выберете их таким образом, что вы действительно не знаю $secret, я бы всегда хотел определить $b = "", чтобы сделать атаку максимально легкой. Радужные столы - ваши друзья в этом случае.

3 голосов
/ 24 апреля 2011

Если MD5 ведет себя как случайный оракул (это большое «если», см. Ниже), то исчерпывающий поиск по $secret является наилучшей из возможных атак - и, что более важно, каждое «предположение» о значении $secret ДОЛЖЕН использовать запрос к функции (поскольку вы используете PHP, я предполагаю, что функция реализована на веб-сервере, и каждый «запрос» требует обращения к этому серверу).Последнее подразумевается из-за отсутствия информации, возвращаемой злоумышленнику: злоумышленник не получает ничего, кроме одного бита (результат «True» или «False»).В частности, он не получает сам вывод MD5.Атакующий получит длинный поток неинформативных результатов «False», если он не попадет на правильный вывод MD5, либо по чистой случайности (вероятность 2 -128 , что на самом деле чертовски мало), либо потому, что онправильно угадал значение $secret заранее.Стоит отметить, что это мешает злоумышленнику использовать многие методы разделения затрат, включая предварительно вычисленные таблицы, в частности чрезмерно раскрученные радужные таблицы .

A случайный оракул - это мифический объект, который можно рассматривать как детерминированный черный ящик: вы знаете ничего на выходе, который вы получите от данного входа, за исключением того, что блок всегда будет возвращать один и тот же результат для данного входа.Модель выглядит следующим образом: коробка содержит гнома, несколько кубиков и большую книгу.Гном использует кости, чтобы случайным образом выбрать выход.Он также использует книгу, чтобы отследить ответы, которые он уже отправил, чтобы быть последовательным, то есть, если ввод идентичен ранее представленному вводу, гном будет возвращать тот же вывод, что и ранее, вместо того, чтобы бросать кубики.

MD5, однако, не случайный оракул.Например, мы можем создавать коллизии для MD5 намного быстрее, чем теоретическое сопротивление 2 64 для функции с 128-битным выходом.Кроме того, обратите внимание, что для хорошей хеш-функции (устойчивой к столкновениям и т. Д.) Абсолютно не требуется «случайный оракул».Например, SHA-256 считается безопасной хеш-функцией, хотя она все еще страдает от так называемой «атаки с расширением длины» (учитывая SHA256($a), можно вычислить SHA256($a . $b), не зная $a, для почти произвольных значений $b).Таким образом, гарантии случайного оракула не распространяются на MD5 (или, в этом отношении, SHA-256).Это не значит, что более быстрые атаки известны!Только то, что вы здесь сами по себе.

Можно также указать, что md5($b . $secret) является своего рода «хеш-ключом», то есть MAC (Код аутентификации сообщения).Создать MAC из хеш-функции непросто, именно из-за таких вещей, как атака с расширением длины (например, md5($secret . $b) будет очень плохим MAC).Был разработан надежный способ построения MAC из хеш-функции;он называется HMAC и включает два вызова базовой хэш-функции (но один из них находится на коротком входе, поэтому, тем не менее, он эффективен).Безопасность HMAC, точнее то, как можно считать, что HMAC ведет себя как случайный оракул, может быть «доказана», то есть сведена к некоторым внутренним свойствам хеш-функции, которые считаются верными в случае SHA-256 (см. Новые доказательствадля NMAC и HMAC: безопасность без столкновений (автор Mihir Bellare для подробностей).Используя HMAC / SHA-256 вместо $b с $secret в качестве ключа, вы получите выгоду от этих результатов безопасности, и ваша конструкция будет более убедительной.С другой стороны, я не утверждаю, что существует известная атака на md5($b . $secret), только то, что использование MD5 и самодельной конструкции MAC поднимают красные флаги, которые снижают уровень доверия, который может быть приданк такой системе.

1 голос
/ 24 апреля 2011

скачать радужную таблицу / пароль хеш известного пароля! :)

...