Вот Код (PHP): //Пароль, который вводит пользователь при регистрации. $pass = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopas'; $hash = password_hash($pass, PASSWORD_BCRYPT); ... //Пароль, который вводит пользователь при авторизации. $pass_2 = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzxcvbnm'; if (password_verify($pass_2, $hash)) {echo 'Вход выполнен';} else {echo 'Вход НЕ выполнен';} И вот при таком раскладе вход будет выполнен. Перед написанием ответа еще раз протестировал. Код (PHP): $a1 = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzxc'; $a2 = 'qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiopasdfqwertyuiopasdfghjklzx'; При пароле $a1 вход еще выполняется, а при пароле $а2 - уже нет.
password_hash() и password_verify() никак не связаны с тем, что md5 и sha256 считаются ненадежными. Эти функции будут юзать тот же md5, если ничего окромя него в системе не предусмотрено. Их сделали из соображений того, что куча криворуких дятлов хранят пароли в открытом виде просто по той причине, у них мозгов не хватает осилить нормальное хеширование с нормальной солегенерацией. Либо криворукие дятлы хранят соли или хеши в куках либо еще что. В общем, процент криворуких дятлов, не могущих в безопасность растет. Процент юзания PHP в мире тоже не снижается. В сумме общий фон безопасности катится во мглу. Сайтов больше, уровень развития меньше. Криворукие дятлы учатся по видеоурокам других криворуких дятлов... Сели разрабы, покурили с горя, и решили сделать password_hash() и password_verify(), чтобы как-то выправлять ситуацию. Если криворукие дятлы не могут сами в механизмы хранения паролей, давайте замутим этот механизм на уровне языка.
Это не коллизия, а результат ограничения. http://php.net/manual/ru/function.password-hash.html#refsect ... parameters
Плохо понял. Там английским по-желтому написано: При юзании бикрипта, принимаемый в параметры пароль будет усечен до 72 символов, такие дела. То есть все, что свыше 72 символов, отбрасывается. Если два пароля на дистанции 72 символа совпадают, а дальше нет, значит они одинаковые. НО, даже в таком случае не нужно пользователя ограничивать. Если у него пароль в 100 символов, пусть вводит его как есть. Пусть из них ты будешь использовать только 72, плевать. Совершенно плевать. Но пользователю так удобнее.
Тоже задался вопросом регулярных выражений для кириллицы. Исследование показало, что они не работают! Там целый ряд букв выпадает из выражения /^[а-я]+$/. По какому принципу одна буква находится в выражении, а другая нет - совершенно неясно. Выпадает буква "ё" и полный диапазон от "р" до "ю". С английскими буквами такого не происходит. Кодировка UTF-8. Отсюда следует, что надо найти более эффективный способ для поиска кириллических символов. Предлагаю использовать mb_strpos (поиск подстроки/символа в строке) вместо preg_match. Вот как это теперь работает: Код (Text): $nameRus = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"; for ($i = 0; $i < mb_strlen($nameRus); $i++) { echo '$i='."$i"." ".mb_substr($nameRus, $i, 1); if (mb_strpos($nameRus, mb_substr($nameRus, $i, 1)) === false) echo " ERROR</br>"; else echo "</br>"; } Ошибка теперь не возникает. Ещё про пароли (так как в этой теме об этом тоже говорится). Неясно, почему не следует ограничивать пользователя в длине и подборе пароля? Зачем вообще нужны длинные пароли со сложными символами? Нет, конечно, если есть риск, что пользователя взломает иностранная разведка, тогда, конечно, нужны. Но если пользователь обычный человек, то кому он нужен, чтобы его взламывали? Шесть-семь символов пароля ему вполне достаточно будет!