Phpass - как проверить логин и пароль на соответствие имени пользователя и пароля в базе данных
Я успешно использовал Phpass для хэширования паролей зарегистрированных пользователей и сохранения их в базе данных, теперь я застрял на входе в систему, как проверить введенные имя пользователя и пароль, проверив, существует ли имя пользователя в базе данных, а затем проверил хешированный пароль по отношению к указанному.
Любая помощь высоко ценится!!! Спасибо!
Это мой код:
<?php
// Inialize session
session_start();
// Include database connection settings
include('config.inc');
require("PasswordHash.php");
$hasher = new PasswordHash(8, false);
$username = $_POST['username'];
$password = $_POST['password'];
// Passwords should never be longer than 72 characters to prevent DoS attacks
if (strlen($password) > 72) { die("Password must be 72 characters or less"); }
$query = "SELECT * FROM user WHERE username = '$username'";
$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows = 1) {
$res = mysql_query("SELECT password FROM user WHERE username = '$username'");
$row = mysql_fetch_array($res);
$hash = $row['password'];
$password = $_POST['password'];
if ($hasher->CheckPassword($password, $hash)) { //$hash is the hash retrieved from the DB
$what = 'Authentication succeeded';
} else {
$what = 'Authentication failed';
}
} else {
echo "No Such User";
include 'login.php';
exit();
}
echo "$what\n";
echo "<br />";
echo "$hash";
?>
ЭТО МОЙ РАБОЧИЙ КОДЕКС ДЛЯ ПРЕИМУЩЕСТВА ДРУГИХ:
<?php
// Inialize session
session_start();
// Include database connection settings
include('config.inc');
require("PasswordHash.php");
$hasher = new PasswordHash(8, false);
$username = $_POST['username'];
$password = $_POST['password'];
// Passwords should never be longer than 72 characters to prevent DoS attacks
if (strlen($password) > 72) { die("Password must be 72 characters or less"); }
$query = "SELECT * FROM user WHERE username = '$username'";
$query = mysql_query($query);
$numrows = mysql_num_rows($query);
if ($numrows = 1) {
$res = mysql_query("SELECT * FROM user WHERE username = '$username'");
$row = mysql_fetch_array($res);
$hash = $row['password'];
$password = $_POST['password'];
if ($hasher->CheckPassword($password, $hash)) { //$hash is the hash retrieved from the DB
$what = 'Authentication succeeded';
} else {
$what = 'Authentication failed';
}
} else {
echo "No Such User";
include 'login.php';
exit();
}
echo "$what\n";
echo "<br />";
echo "$hash";
?>
1 ответ
Вот как работает phpass: когда вы сохраняете пароль пользователя (когда он его создает), вы сохраняете его перед сохранением, например, так:
$hash_iterations = 30;
$portable_hashes = FALSE;
$hasher = new PasswordHash($hash_iterations, $portable_hashes);
$hash_value = $hasher->HashPassword($actual_password);
Затем сохранить $hash_value
в базе данных в качестве пароля пользователя. Когда вы идете, чтобы проверить пользователя, ищите пользователя по имени пользователя. Если найдено, сравните фактический пароль из базы данных (сохраненный хеш) с хешем, введенным пользователем:
// $stored_hash is the value you saved in the database for this user's password
// $user_input is the POST data from the user with the actual password
$valid_password = $hasher->CheckPassword($user_input, $stored_hash);
Убедитесь, что инициализировали PasswordHash
класс одинаково каждый раз, с одинаковыми значениями для $hash_iterations
а также $portable_hashes
или сравнение не будет работать правильно.