Каков наилучший способ сравнить хэшированные строки?(PHP) - PullRequest
6 голосов
/ 06 марта 2011

Должен ли я использовать if(strcmp(md5($string),$hash)==0) или if(md5($string)==$hash)

Ответы [ 5 ]

23 голосов
/ 30 мая 2014

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

Хотя это звучит очень нелогично, вы должныполное сравнение строки, избегая каких-либо оптимизаций (т. е. преждевременного выхода, если символ отличается).

Вот несколько ссылок о проблеме:

И вот несколько идей, чтобы исправить это:

16 голосов
/ 10 декабря 2012

Если вы сравниваете строки, используйте strcmp или ===. Люди предпочитают ===, потому что strcmp может сбивать с толку (возвращает 0 в случае успеха, ват).

Вы должны использовать ===, а не ==. == преобразует оба операнда в целые числа, если их можно интерпретировать как таковые, и поскольку хэш MD5 не помещается в целое число, они будут усечены примерно до половины. Следовательно, только первые половины хэшей должны быть равны. Смотри http://phpsadness.com/sad/47.

Если вы хэшируете пароли, рассмотрите возможность использования медленного и сильного алгоритма хеширования, такого как PBKDF2, а не MD5.

4 голосов
/ 23 марта 2016

Если вы используете что-то более новое, чем PHP 5.6 (и в том числе), вы должны использовать безопасное сравнение строк с синхронизацией атаки * функция 1002 *.

if (hash_equals($expected, $correct)) {

}

(Если вы используете PHP 5.5или ранее см. здесь эквиваленты .)

0 голосов
/ 14 сентября 2016

На самом деле вы должны использовать password_verify для этого, а также использовать все другие password_* функции.Они доступны в PHP> = 5.5.0.

В качестве запасного варианта вы можете использовать этот полифилл .В настоящее время он работает с PHP> = 5.3.7.

И если вы действительно не можете / хотите использовать это, все равно hash_equals (и полифиллы для этого) как @MM.уже сказал.

0 голосов
/ 06 марта 2011

Я думаю, if(md5($string) == $hash) лучше, потому что у вас есть только одно сравнение вместо 2 (stcmp & ==).

md5 генерирует только ascii-символы, которые не нуждаются в бинарном безопасном сравнении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...