php хеш пароля — PHP password_hash (), password_verify ()

Мой сценарий регистрации принимает пароль пользователя и затем использует PHP-функцию password_hash для шифрования пароля, а затем помещает его в базу данных. Когда я вхожу в систему, используя только что созданного пользователя, я получаю сообщение об ошибке, которое проверяет, совпадают ли пароли или нет. В моем случае это не так. Что я делаю неправильно, когда я выполняю вызов функции password_verify в сценарии входа?

РЕГИСТР

if($_SERVER["REQUEST_METHOD"] == "POST"){
function secure($data){
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return($data);
}

$p_num = secure($_POST["p_number"]);
$first_name = secure($_POST["first_name"]);
$last_name = secure($_POST["last_name"]);
$email = secure($_POST["email"]);
$password = secure($_POST["pw"]);
$verify_password = secure($_POST["pw_verify"]);
$program = secure($_POST["program"]);
$role = secure($_POST["role"]);
$logged_in = 0;
$registered = 0;
$image = "../images/profile_placeholder.png";

if($password != $verify_password){
echo "Nope.  Passwords";
}
else{
$registered = 1;
$password = password_hash($password, PASSWORD_DEFAULT);
$insert = "INSERT INTO `$user_table`(`user_id`, `first_name`, `last_name`, `password`, `image`, `email`, `program`, `role`, `logged_in`, `registered`) VALUES('" .$p_num ."', '" .$first_name ."', '" .$last_name ."', '" .$password ."', '" .$image ."', '" .$email ."', '" .$program ."', '" .$role ."', '" .$logged_in ."', '" .$registered ."')";
$query = mysqli_query($connect, $insert);
echo "Success!";
}
}

АВТОРИЗОВАТЬСЯ

if($_SERVER["REQUEST_METHOD"] == "POST"){
$p_num = $_POST["username"];
$pwd = $_POST["password"];

$query = "SELECT * FROM `$user_table` WHERE `user_id` = '$p_num'";
$result = mysqli_query($connect, $query);
while($row = mysqli_fetch_assoc($result)){
$user_id = "{$row['user_id']}";
$first_name = "{$row['first_name']}";
$last_name = "{$row['last_name']}";
$user_name = $first_name ." " .$last_name;
$password = "{$row['password']}";
$image = "{$row['image']}";
$email = "{$row['email']}";
$program = "{$row['program']}";
$role = "{$row['role']}";
$status = "{$row['logged_in']}";
$registered = "{$row['registered']}";
if(($user_id == $p_num) && (password_verify($pwd, $password))){
$_SESSION["id"] = $user_id;
$_SESSION["user"] = $user_name;
$_SESSION["program"] = $program;
$_SESSION["pass"] = $password;
$_SESSION["image"] = $image;
$_SESSION["email"] = $email;
$_SESSION["role"] = $role;
$_SESSION["status"] = $status;
$_SESSION["registered"] = $registered;
$loggedin = "UPDATE `$user_table` SET `logged_in` = 1 WHERE `user_id` = '$user_id'";
}
var_dump($pwd);
var_dump($password);
}

Вот что я получаю, когда делаю var_dump:

string(1) "1" string(16) "$2y$10$0aysCso3b"

Очевидно, что пароли не совпадают друг с другом. Итак, в сценарии регистрации пароль хешируется и отправляется в базу данных. Затем, когда пользователь входит в систему, сценарий входа в систему просматривает пароль, введенный пользователем для входа в систему, а затем проверяет его на соответствие хешированному паролю в базе данных с помощью password_verify. Тем не менее, хешированный пароль не принимает не хэшированный пароль как совпадающий. Что я не понимаю, почему?

8

Решение

Вот что я использую для password_hash а также password_verify, Попробуйте, как написано, вы можете начать добавлять оставшуюся часть кода, как только успешно.

Измените имена таблиц и столбцов, чтобы они подходили.

N.B .: Это основной метод вставки. Я предлагаю вам использовать готовые заявления вместо.

Sidenote: столбец пароля должен быть достаточно длинным, чтобы вместить хеш VARCHAR(255), Консультируйтесь с «Сносками».

INSERT файл

<?php
$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}

$password = "rasmuslerdorf";
$first_name = "john";
$password = password_hash($password, PASSWORD_DEFAULT);

$sql = "INSERT INTO users (`name`, `password`) VALUES ('" .$first_name ."', '" .$password ."')";

$query = mysqli_query($conn, $sql);
if($query)

{
echo "Success!";
}

else{
// echo "Error";
die('There was an error running the query [' . $conn->error . ']');
}

Файл логина

<?php
// session_start();

$DB_HOST = 'xxx';
$DB_USER = 'xxx';
$DB_PASS = 'xxx';
$DB_NAME = 'xxx';

$conn = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if($conn->connect_errno > 0) {
die('Connection failed [' . $conn->connect_error . ']');
}

$pwd = "rasmuslerdorf";
$first_name = "john";

//$sql = "SELECT * FROM users WHERE id = 1";

$sql = "SELECT * FROM users WHERE name='$first_name'";
$result = $conn->query($sql);
if ($result->num_rows === 1) {
$row = $result->fetch_array(MYSQLI_ASSOC);
if (password_verify($pwd, $row['password'])) {

//Password matches, so create the session
// $_SESSION['user'] = $row['user_id'];
// header("Location: http://www.example.com/logged_in.php");

echo "Match";

}else{
echo  "The username or password do not match";
}

}

mysqli_close($conn);

Примечания:

Столбец пароля должен быть достаточно длинным, чтобы содержать хэш. 72 длинна — это то, что хеш производит в длине символа, но руководство предлагает 255.

Ссылка:

«Используйте алгоритм bcrypt (по умолчанию в PHP 5.5.0). Обратите внимание, что эта константа может изменяться со временем по мере добавления в PHP новых и более сильных алгоритмов. По этой причине длина результата от использования этого идентификатора может измениться со временем. Поэтому рекомендуется сохранять результат в столбце базы данных, который может расширяться за пределы 60 символов (255 символов будет хорошим выбором). «

15

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

Друзья, поскольку мы используем уникальное имя пользователя для входа в систему, поэтому нам нужно выбрать пароль / данные из базы данных, используя только имя пользователя.

Пример:

<?php
$connect = mysqli_connect($localhost, $username, $pwd, $database) or die("Opps some thing went wrong");

if (isset($_POST['submit'])) {
extract($_POST);

// Get Old Password from Database which is having unique userName
$sqlQuery = mysqli_query($connect, "select * from loginTable where User='$username'");
$res = mysqli_fetch_array($sqlQuery);
$current_password = $res['userPassword'];

if (password_verify($enteredPassword, $current_password)) {
/* If Password is valid!! */
$_SESSION['id'] = $res['id'];
header("location: home.php");
}
else {
/* If Invalid password Entered */
$alt = "Login Failed! Wrong user ID or Password";
header("location: index.php?m=$alt");
}
}
?>

Это работает для меня …
Я выбираю пароль из базы данных и сравниваю с введенным паролем
Использование PHP API, т.е. password_verify ($ enterPassword, $ current_password)

1

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