Если 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 поднимают красные флаги, которые снижают уровень доверия, который может быть приданк такой системе.