2015-04-22 3 views
0

Может кто-нибудь скажет мне, как я могу проверить хешированный пароль, когда кто-то входит в систему?Как проверить пароль хеширования при входе пользователя в систему

вот мой регистрационный код:

$db_password = password_hash($password, PASSWORD_DEFAULT); 

// Enter info into the Database. 
$info2 = htmlspecialchars($info); 
$sql = mysql_query("INSERT INTO users 
        (first_name, last_name, email_address, username, password, signup_date) 
        VALUES('$first_name', '$last_name', 
          '$email_address', '$username', 
          '$db_password', now())") 
       or die (mysql_error()); 

это мой код проверки пользователя запустить при входе в систему. ,

$hash = password_hash($password, PASSWORD_DEFAULT); 

// check if the user info validates the db 
$sql = mysql_query("SELECT * 
        FROM users 
        WHERE username='$username' 
         AND password='$hash' 
         AND activated='1'"); 
$login_check = mysql_num_rows($sql); 

Я не могу понять это.

+0

забыл добавить при входе в системе я встретился с недействительным мандатным сообщением – user3205214

+2

При проверке пароля, вы читаете существующий хэш от базы данных и использовать [password_verify()] (http://www.php.net/manual/en/function.password-verify.php), чтобы проверить, что против введенного пользователем пароля –

+0

Пожалуйста, [прекратите использование 'mysql_ * 'functions] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php). Они больше не поддерживаются и [официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). Узнайте о [подготовленных заявлениях] (http://en.wikipedia.org/wiki/Prepared_statement) и используйте [PDO] (http://jayblanchard.net/demystifying_php_pdo.html). Кроме того, способ использования переменных в ваших запросах приводит меня к мысли, что вы можете стать жертвой [SQL Injection.] (Http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection -in-php) –

ответ

2

Ваша проверка неверна ... вы снова вводите пароль, что приведет к совершенно новой соли ... таким образом, совершенно другое значение хэша. Когда пароли хэшируются (правильно), они используют соль (случайную строку), которая достаточно длинна, чтобы предотвратить атаку радуги. password_hash делает все это за кулисами для вас.

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

Когда пользователь входит в систему, вам нужно сделать:

if(password_verify($loginPasswordText, $hashStoredInDb)) { 
    //SUCCESS 
} 
0

Нет необходимости пароль снова хэширования во время входа используйте просто password_verify() функцию, чтобы подтвердить свой сохраненный пароль & данный пароль при входе в данный момент. Подробнее о хэшировании паролей API здесь http://php.net/manual/en/ref.password.php

Сейчас Попробуйте, как это,

<?php 
    // this is the example hashed password that you have to select from Database. 
    $hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq'; 

    if (password_verify('password_given_at_login', $hash)) { 
     echo 'Password is valid!'; 
    } else { 
     echo 'Invalid password.'; 
    } 
    ?> 
Смежные вопросы