За последние 24 часа нас посетили 17845 программистов и 1719 роботов. Сейчас ищут 948 программистов ...

Вопрос про функцию crypt()

Тема в разделе "PHP для новичков", создана пользователем pircul, 25 янв 2014.

  1. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Здравствуйте! Решил перестать использовать md5 и заменить его функцией crypt() но тут же появилась проблема при проверке пароля который ввел пользователь и того что находится в БД.

    Делаю проверку так
    Код (Text):
    1. $password = $data['password'];//это я забрал из БД.  
    2.  
    3. if (crypt('1234567', $password) == $password) {
    4.    echo "Пароль верен!";
    5. }else{
    6.    echo "Неверный Пароль!";
    7. }
    В $password лежит хеш пароля 1234567 созданный с помощью функции crypt(). Но я всегда вижу "Неверный пароль". Почему так происходит, что я делаю не так?

    Но если делать пароль не доставать из БД а написать вручную в коде пропустив её через функцию crypt(), тогда все работает.
    Код (Text):
    1. $password = crypt('1234567');
    2.  
    3. if (crypt('1234567', $password) == $password) {
    4.    echo "Пароль верен!";
    5. }
    Так работает. В чем разница? Ведь я так же записывал в БД пароль при регистрации crypt($_POST['crypt']); Куда вводил такой же пароль, тоесть 1234567

    Такое ощущение что хеш совпадает только когда "сценарий один". Тоесть когда хеш генерируется за 1 запрос. А у меня записанный в БД хеш конечно же взят из сценария регистрации. Может быть из за этого сверение паролей не проходит? Подскажите пожалуйста как решить проблему.
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я конечно может и сам что то недопонимаю но:
    Код (Text):
    1. $password = crypt('1234567');
    2. $password2 = crypt('1234567', $password);
    3.  
    4. echo '<p>'.'password: '. $password . '</p>';
    5. echo '<p>'.'password2: '. $password2 . '</p>';
    пароли совпадают, но по обновляй страницу и убедись в том, что они каждый раз разные, а в базе данных он один, по этому по факту не может работать, тут пароль вообще теряется.

    Ты не правильно используешь crypt(), его надо использовать всегда с солью, т.к. без соли он всегда будет выдавать разные пароли:

    Код (Text):
    1. echo '<p>'.crypt('1234567') . '</p>'; // $1$/n4.4U/.$CNpa5hnb9Tpx0ykvbgm3b1
    2. echo '<p>'.crypt('1234567') . '</p>'; // $1$hM4.0r..$oNY1mFVY6.zK7KrpLRPci1
    3. echo '<p>'.crypt('1234567') . '</p>'; // $1$Lg/.5V5.$e6Wj.KRd7H2nEDU3CnhOY1
    а с солью он всегда будет один и тот же:
    Код (Text):
    1. $salt = 'qwerty';
    2. echo '<p>'.crypt('1234567', $salt) . '</p>'; // qwj2zBxreROQw
    3. echo '<p>'.crypt('1234567', $salt) . '</p>'; // qwj2zBxreROQw
    4. echo '<p>'.crypt('1234567', $salt) . '</p>'; // qwj2zBxreROQw
    по этому шифровка должна выглядеть примерно так:
    Код (Text):
    1. // пароль который вводит непосредственно пользователь:
    2. $from_user = '1234567';
    3.  
    4. // делаем соль (sha1 аналог md5):
    5. $salt = sha1($from_user);
    6.  
    7. // в базе должно хранится $to_db
    8. $to_db = crypt($from_user, $salt);
    9.  
    10.  
    11. // получаем из БД и звписываем в переменную
    12. // в $in_bd будет тоже самое что и в $to_db
    13. $in_bd = $data['password'];
    14.  
    15.  
    16. // а теперь сравниваем:
    17. if ( crypt($from_user, $salt) == $in_bd ) {echo 'OK'; }
    18. else { echo 'Not OK'; }
     
  3. pircul

    pircul Активный пользователь

    С нами с:
    14 янв 2014
    Сообщения:
    100
    Симпатии:
    0
    Спасибо что откликнулись... я почему то думал значение строк и независимо от соли парсит сам интерпретатор и выдает для каждой строки свой уникальный хеш.

    Ваш пример не совсем правильный но рабочий. Разобравшись и вам подскажу. Нужно использовать ту соль(вариантов несколько) которую предлагает мануал для каждого из алгоритмов шифрования, тогда пароль будет в разны длиннее и надеждее. Спасибо ещё раз
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Мой пример это всего лишь пример, а алгоритм создания соли для каждого сайта должна быть уникален, и известен только самому разработчику.

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

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    > Почему так происходит, что я делаю не так?

    У вас проблема где-то в другом месте, ищите. С криптом вы все верно проверяете.