Использование PHPass для хеширования проблем с паролями

Я использую PHPASS для хранения зашифрованного пароля и сравнения при входе в систему.

вот код

ob_start();
$userName = $password = "";
$userNameErr = $passwordErr = $loginErr = "";
$hasher = new PasswordHash(8, false);

if (isset($_POST['subEmployee'])) {
if (empty($_POST['user_name'])) {
$userNameErr = "User name is required";

} else {
$userName = check_input($_POST['user_name']);
if (!preg_match("/^[0-9_a-zA-Z]*$/", $userName)) {
$userNameErr = "Only letters, numbers and '_' allowed";
}
}
if (empty($_POST['password'])) {
$passwordErr = "Password is required";
}else{
$password = check_input($_POST['password']);
}

$active = 1;
$loginUser = $db->prepare("SELECT password FROM users WHERE user_name=? AND activity=?");
$loginUser->bind_param('si', $userName, $active);
if ($loginUser->execute()) {
$results = $loginUser->get_result();
if ($results->num_rows == 1) {
$row = $results->fetch_object();
$stored_hash = "*";
$stored_hash = $row->password;
$check = $hasher->CheckPassword($password, $stored_hash);
if ($check) {
$_SESSION['name'] = $row->first_name;
$_SESSION['userId'] = $row->id;
$_SESSION['user'] = 1;
print_r($_SESSION);
header("Location:?pid=4");
} elseif (!empty($_POST['user_name']) && !empty($_POST['password'])) {
$loginErr = "'Invalid Login Information'";
}
}
}
}

пока он всегда выдает одно и то же сообщение «Неверная информация для входа в систему». Я сделал регистрационную форму, в которой мой пароль хранится следующим образом.

$hasher = new PasswordHash(8, false);
$hash = md5(rand(0, 1000));

if (empty($_POST['password'])) {
$error ['passwordErr'] = "Password is required";
} elseif (strlen($_POST['password']) < 8) {
$error ['passwordErr'] = "<span class='notAllowed'>Chose password with at last eight characters</span>";
} elseif (strlen($_POST['password']) > 72) {
$error ['passwordErr'] = "<span class='notAllowed'>Password max 72 characters</span>";
} elseif ($_POST['password'] !== $_POST['confirm']) {
$error ['passwordErr'] = "Password don't matching";
} else {
$password = $hasher->HashPassword($password);
}

когда я проверил свою базу данных, мне кажется, что пароль хэширован, а имя пользователя там и все в порядке

но все равно получаю это сообщение как «Неверная информация для входа».

это две строки правильно

$loginUser = $db->prepare("SELECT password FROM users WHERE user_name=? AND activity=?");
$loginUser->bind_param('si', $userName, $active);

делает логин код ОК.

Я тоже попробую

Обновить
Я обновил свой код

if (isset($_POST['subEmployee'])) {
$error=array();

$hash_cost_log2 = 8;
$hash_portable = FALSE;
$hasher = new PasswordHash($hash_cost_log2, $hash_portable);

if (empty($_POST['user_name'])) {
$userNameErr = "User name is required";

} else {
$userName = check_input($_POST['user_name']);
if (!preg_match("/^[0-9_a-zA-Z]*$/", $userName)) {
$userNameErr = "Only letters, numbers and '_' allowed";
}
}
if (empty($_POST['password'])) {
$passwordErr = "Password is required";
} else {
$password = $_POST['password'];
}
$active = 1;

$loginUser = $db->prepare("SELECT password FROM hired_person_info WHERE user_name=? AND activity=?");
$loginUser->bind_param('si', $userName, $active);
if ($loginUser->execute()) {
$results = $loginUser->get_result();
if ($results->num_rows == 1) {
$row = $results->fetch_object();
$stored_hash = "*";
$stored_hash = $row->password;
$check = $hasher->CheckPassword($password, $stored_hash);
if ($check) {
$_SESSION['name'] = $row->first_name;
$_SESSION['userId'] = $row->id;
$_SESSION['user'] = 1;
print_r($_SESSION);
header("Location:?pid=4");
} elseif (!empty($_POST['user_name']) && !empty($_POST['password'])) {
$loginErr = "'Invalid Login Information'";
}
} else {
$loginErr = "'We didn't find any users'";
}
}
}

добавить это из руководства PHPass

$hash_cost_log2 = 8;
$hash_portable = FALSE;
$hasher = new PasswordHash($hash_cost_log2, $hash_portable);

еще не повезло, кто-нибудь может сказать мне, где я ошибаюсь здесь

редактировать
это мое check_input() код

function check_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}

и я использую PHP 5.3.29

Спасибо

1

Решение

Вот некоторые моменты, которые я бы проверил:

1) В вашем обработчике регистрации вы проверяете непосредственно переменную POST, но для хеширования вы берете переменную $ password, я бы всегда обращался к входу одинаково, например:

$password = $hasher->HashPassword($_POST['password']);

2) функция check_input() не рекомендуется для паролей, так как вы вычисляете хеш-значение, и это хеш-значение в любом случае является «безопасным». Даже для другого пользовательского ввода нужно проверить его так же, как вы, но экранирование должно быть сделано как можно позже, и только для конкретного вывода. Так что функция htmlspecialchars() не должен вызываться для пользовательского ввода, но всегда перед выводом в HTML.

3) В вашем обработчике входа вы получаете доступ к паролю один раз с переменной POST и один раз с переменной $ password. Переменная $ password задается только в операторе if, поэтому, если ввод пуст, вы заполняете ошибку, но продолжаете работу с неинициализированной переменной $ password. Либо заполните переменную только в начале, либо всегда используйте переменную POST.

4) Поскольку вы используете PHP 5.3.29, вы можете использовать новую функцию password_hash() с пакет совместимости. Я не думаю, что библиотека PHPass является проблемой здесь, тем не менее, вот пример для новой функции.

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

5) Другая часто совершаемая ошибка заключается в том, что поле базы данных для хранения хеш-значения слишком короткое, ему нужна длина varchar (60). Может быть, вы могли бы предоставить один из ваших хэшей паролей (конечно, только пример)?

0

Другие решения

Для этой библиотеки требуется PHP> = 5.3.7 ИЛИ версия, в которую вставлено исправление $ 2y (например, предоставленное RedHat).

0

По вопросам рекламы [email protected]