【发布时间】:2023-03-10 10:20:02
【问题描述】:
我正在使用 password_hash 来保护数据库中的密码,但是当我使用 password_verify 时,它不匹配。在第一种情况下,我使用 password_verify 来连接用户,它总是返回 true,即使它不是好的密码。在第二种情况下,当用户想要更改他的密码时,我使用 password_verify,他被要求提供他的实际密码来更改它。在这种情况下,它总是返回 false,即使我以与连接相同的方式使用 password_verify。
在我的数据库中,密码存储为 VARCHAR(60)。我也试过VARCHAR(255),没什么区别。
这是我在用户创建帐户时如何使用 password_hash :
if(isset($_POST['username']) && isset($_POST['password']) && isset($_POST['psw-confirmation'])) {
$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);
$pswConfirmation = htmlspecialchars($_POST['psw-confirmation']);
if($password == $pswConfirmation) {
// Connection to database
require('database-connection.php');
$request = $database->prepare("SELECT * FROM users WHERE username = :username");
$request->execute(array(
":username" => $username
));
$return = $request->fetch();
// If the username doesn't exist yet in the database
if(!$return) {
$request->closeCursor();
$hash = password_hash($password, PASSWORD_BCRYPT);
$addProfile = $database->prepare("INSERT INTO users(username, password) VALUES(:username, :password)");
$addProfile->execute(array(
":username" => $username,
":password" => $hash
));
我猜这部分运行良好,因为我的数据库中确实有一个散列密码:$2y$10$AFV2zouzirBhS30tCCRx9uyZDNMGSJWffUbXMO876T/9nJ8UDQJRi
这是我验证连接密码的方法:
if(isset($_POST['username']) && isset($_POST['password'])) {
$username = htmlspecialchars($_POST['username']);
$password = htmlspecialchars($_POST['password']);
// Connection to database
require('database-connection.php');
$request = $database->prepare("SELECT * FROM users WHERE username = :username");
$request->execute(array(
":username" => $username
));
$return = $request->fetch();
$hash = $return['password'];
// If the username exists in the database
if($return) {
// And if the password match
if(password_verify($password, $hash)) {
echo "connected";
}
当用户想要更改密码时,我如何验证密码: if(isset($_POST['actual-psw']) && isset($_POST['new-psw']) && isset($_POST['confirm-psw'])) {
$actualPsw = htmlspecialchars($_POST['actual-psw']);
$newPsw = htmlspecialchars($_POST['new-psw']);
$confirmPsw = htmlspecialchars($_POST['confirm-psw']);
// Connection to database
require('database-connection.php');
$request = $database->prepare("SELECT * FROM users WHERE id = :id");
$request->execute(array(
':id' => $_SESSION['id']
));
$return = $request->fetch();
$hash = $return['password'];
if(password_verify($actualPsw, $hash)) {
echo "success";
} else {
echo "fail";
}
$_SESSION['id'] 正在返回实际用户的正确 ID。
我不明白为什么它不起作用,这让我更加困惑,在一种情况下它总是正确的,而在另一种情况下它总是错误的,因为我在两种情况下都使用了相同的方式。
【问题讨论】:
-
我知道这里有很多类似的问题,即使是在 stackoverflow 之外,但没有一个能解决我的问题。
标签: php password-hash