Здравствуйте! Решил перестать использовать md5 и заменить его функцией crypt() но тут же появилась проблема при проверке пароля который ввел пользователь и того что находится в БД. Делаю проверку так Код (Text): $password = $data['password'];//это я забрал из БД. if (crypt('1234567', $password) == $password) { echo "Пароль верен!"; }else{ echo "Неверный Пароль!"; } В $password лежит хеш пароля 1234567 созданный с помощью функции crypt(). Но я всегда вижу "Неверный пароль". Почему так происходит, что я делаю не так? Но если делать пароль не доставать из БД а написать вручную в коде пропустив её через функцию crypt(), тогда все работает. Код (Text): $password = crypt('1234567'); if (crypt('1234567', $password) == $password) { echo "Пароль верен!"; } Так работает. В чем разница? Ведь я так же записывал в БД пароль при регистрации crypt($_POST['crypt']); Куда вводил такой же пароль, тоесть 1234567 Такое ощущение что хеш совпадает только когда "сценарий один". Тоесть когда хеш генерируется за 1 запрос. А у меня записанный в БД хеш конечно же взят из сценария регистрации. Может быть из за этого сверение паролей не проходит? Подскажите пожалуйста как решить проблему.
Я конечно может и сам что то недопонимаю но: Код (Text): $password = crypt('1234567'); $password2 = crypt('1234567', $password); echo '<p>'.'password: '. $password . '</p>'; echo '<p>'.'password2: '. $password2 . '</p>'; пароли совпадают, но по обновляй страницу и убедись в том, что они каждый раз разные, а в базе данных он один, по этому по факту не может работать, тут пароль вообще теряется. Ты не правильно используешь crypt(), его надо использовать всегда с солью, т.к. без соли он всегда будет выдавать разные пароли: Код (Text): echo '<p>'.crypt('1234567') . '</p>'; // $1$/n4.4U/.$CNpa5hnb9Tpx0ykvbgm3b1 echo '<p>'.crypt('1234567') . '</p>'; // $1$hM4.0r..$oNY1mFVY6.zK7KrpLRPci1 echo '<p>'.crypt('1234567') . '</p>'; // $1$Lg/.5V5.$e6Wj.KRd7H2nEDU3CnhOY1 а с солью он всегда будет один и тот же: Код (Text): $salt = 'qwerty'; echo '<p>'.crypt('1234567', $salt) . '</p>'; // qwj2zBxreROQw echo '<p>'.crypt('1234567', $salt) . '</p>'; // qwj2zBxreROQw echo '<p>'.crypt('1234567', $salt) . '</p>'; // qwj2zBxreROQw по этому шифровка должна выглядеть примерно так: Код (Text): // пароль который вводит непосредственно пользователь: $from_user = '1234567'; // делаем соль (sha1 аналог md5): $salt = sha1($from_user); // в базе должно хранится $to_db $to_db = crypt($from_user, $salt); // получаем из БД и звписываем в переменную // в $in_bd будет тоже самое что и в $to_db $in_bd = $data['password']; // а теперь сравниваем: if ( crypt($from_user, $salt) == $in_bd ) {echo 'OK'; } else { echo 'Not OK'; }
Спасибо что откликнулись... я почему то думал значение строк и независимо от соли парсит сам интерпретатор и выдает для каждой строки свой уникальный хеш. Ваш пример не совсем правильный но рабочий. Разобравшись и вам подскажу. Нужно использовать ту соль(вариантов несколько) которую предлагает мануал для каждого из алгоритмов шифрования, тогда пароль будет в разны длиннее и надеждее. Спасибо ещё раз
Мой пример это всего лишь пример, а алгоритм создания соли для каждого сайта должна быть уникален, и известен только самому разработчику. Так же как мне ранее сказали сама соль для каждого пароля (пользователя) должна быть уникальная, т.е. если для всех пользователей соль будет одинаковая то это будет что то между мало-эффективно и глупо.
> Почему так происходит, что я делаю не так? У вас проблема где-то в другом месте, ищите. С криптом вы все верно проверяете.