我正在用MySQL和PHP做一个登录系统。然后,我想使用password_hash和password_verify函数来加密用户的密码。但是,在我比较散列密码和散列密码(password_verify func)时,它并不适用。
这是我的密码。
signup.php
$password_hashed = password_hash($data['password'], PASSWORD_DEFAULT, array("cost"=>15));
$statement = $connection->prepare("INSERT INTO users (username, email, password) VALUES (:username, :email, :password)");
if ($statement && empty($result1)) {
$result = $statement->execute( [
':username' => $data['username'],
':email' => $data['email'],
':password' => $password_hashed,
]);
header('Location: register.php');
$_SESSION['messages'][] = 'Thank you for registration. Check your email then log in.';
exit();
}login.php
if ($user['username'] === $username && $user['password'] === password_verify($user['password'], $password)) {
header("Location: panel.php");
$_SESSION['username'] = $user['username'];
die();
} else {
$_SESSION['messages'][] = 'Incorrect user or password!';
header('Location: login.php');
}Where $password: $password = $data['password'];
其中$user:
$statement = $connection->prepare('SELECT * FROM users WHERE username = :username');
$statement->execute([':username' => $username]);
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
$user = array_shift($result);输出: Incorrect user or password!
发布于 2020-11-17 18:39:36
这将返回一个布尔值(true/false):
password_verify($user['password'], $password)所以这将永远不会是 true
$user['password'] === password_verify($user['password'], $password)一旦您根据提供的用户名从数据库中选择了用户,只需验证密码:
if (password_verify($user['password'], $password)) {一些关于你的术语的笔记,因为这很重要.
我想要加密用户的密码
不,您不希望_en_crypt用户的密码。你想“打乱”它。这是一个重要的区别。加密的东西可以返回到原来的形式。杂乱无章的事情不能。这是密码安全的重要组成部分。
比较散列密码和散列密码
没有什么“脱节”的东西。password_verify的内部操作是对提供的密码进行散列,并将结果与已散列的存储密码进行比较。在任何情况下,您都不能将存储的散列密码转换回其原始形式。
https://stackoverflow.com/questions/64881267
复制相似问题