password_verify хэш не соответствует паролю

Я сгенерировал хэш пароля, используя код ниже:

$hash = password_hash("test", PASSWORD_BCRYPT);

Затем я сохраняю его в базе данных, используя 255 символов.

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

<?php

//Database connection
require 'database.php';

//Handle logins
if ($_POST['login'])
{
//Receive the login attempt
$login_email = $_POST['login_email'];
$login_password = $_POST['login_password'];

//Get the password hash
if ($statement = $mysqli->prepare("SELECT password FROM accounts WHERE email = ? LIMIT 1"))
{
$statement->bind_param("s", $login_email);
$statement->execute();
$statement->store_result();

//Does the account exist?
if ($statement->num_rows > 0)
{
$statement->bind_result($hash);
$statement->fetch();

//echo $login_password;
echo $hash."<br>";
//$hash = password_hash("test", PASSWORD_BCRYPT);
//echo $hash."<br>";

//Check the password hash
if (password_verify($login_password, $hash))
{
echo '<br>Password is valid!';

//Begin session
session_start();
$_SESSION["favcolor"] = "yellow";
}
else
{
echo '<br>Invalid password.';
}
}
else
{
//Account doesn't exist warning
}

$statement->free_result();
$statement->close();
}
}

//Handle new registrations
if ($_POST['register'])
{
//Receive the register attempt
$register_email = $_POST['register_email'];
$register_password_one = $_POST['register_password_one'];
$register_password_two = $_POST['register_password_two'];

//Check if email is already taken
if ($statement = $mysqli->prepare("SELECT email FROM accounts WHERE email = ? LIMIT 1"))
{
$statement->bind_param("s", $register_email);
$statement->execute();
$statement->store_result();

//Does the account exist?
if ($statement->num_rows > 0)
{
//Account already exists warning
}
else
{
//Create the account
if ($statement = $mysqli->prepare("INSERT INTO accounts (email, password) VALUES (?,?)"))
{
//Create bycrypt hash of password
$hash = password_hash($register_password_one, PASSWORD_BCRYPT);

//Insert new account
$statement->bind_param("ss", $register_email, $hash);
$statement->execute();
$account_id = $statement->insert_id;
$statement->close();

//Begin session
session_start();
$_SESSION["favcolor"] = "yellow";
}
}
$statement->free_result();
$statement->close();
}
}

//Handle logout
if ($_POST['logout'])
{
session_unset();
session_destroy();
}

?>

хеш пароля в базе данных: $ 2y $ 10 $ xDnZIjzw8h.9utp3qyRlxezPd8jmK9k6Z5JuoVtooOpkPCBd.n6W6
только что созданный хэш пароля (работает): $ 2y $ 10 $ tolDQdeTQrTio8IJ0Wi9AuHN5Km28pSB5kUh5qfkdkOsDXP295H1K

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

2

Решение

  • генерируемый хэш каждый раз отличается
  • передать простой текст в функцию password_verify () … см. ниже

$originalPassword = password_hash("THE_PASSWORD", PASSWORD_DEFAULT);
// This will produce something like (taken form above)
$2y$10$tolDQdeTQrTio8IJ0Wi9AuHN5Km28pSB5kUh5qfkdkOsDXP295H1K

// When verifying this if(password_verify("THE_PASSWORD", $passwordFromDatabase['password'])){ echo "Success"; }else{ echo "Fail"; }

2

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

Других решений пока нет ...

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