password_verify 存储到数据库后将不起作用
password_verify won't work after storing in database
我已经搜索和阅读了大约 50 个关于我的问题的帖子,但仍然无法弄清楚我的问题,所以我来了。
问题:password_verify()
returns 即使密码正确也是错误的。
这就是我将密码存储到数据库中的方式(注册和编辑个人资料时)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
还有我最新的 password_verify()
(我已经尝试了很多示例,但没有一个有效,现在我坐在这里,代码仍然无法正常工作)
public function doLogin($username,$password){
try{
$stmt = $this->conn->prepare("SELECT id, username, password FROM users WHERE username=:username");
$stmt->execute(array(':username'=>$username));
$userRow=$stmt->fetch(PDO::FETCH_ASSOC);
if (password_verify($password, $userRow['password'])) {
$_SESSION['user_session'] = $userRow['id'];
$_SESSION["result"]='You have succesfully logged in your profile!';
return true;
}else{
return false;
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
我的数据库字段是 25 个字符长。这里有什么问题?
根据 password_hash()
的手册
[...] Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice)
这意味着如果您有一个长度为 59 或更短的列,password_verify()
将默默地失败。因为 MySQL 会在您不说任何内容的情况下插入散列密码时截断散列字符串。
解决方案是将 password
列的长度设置为 60 或更高 - 手册建议将其设置为 255,所以就这样做吧。
任何已存储的密码都不会修复其哈希值,因此需要更新或重新插入。
我已经搜索和阅读了大约 50 个关于我的问题的帖子,但仍然无法弄清楚我的问题,所以我来了。
问题:password_verify()
returns 即使密码正确也是错误的。
这就是我将密码存储到数据库中的方式(注册和编辑个人资料时)
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
还有我最新的 password_verify()
(我已经尝试了很多示例,但没有一个有效,现在我坐在这里,代码仍然无法正常工作)
public function doLogin($username,$password){
try{
$stmt = $this->conn->prepare("SELECT id, username, password FROM users WHERE username=:username");
$stmt->execute(array(':username'=>$username));
$userRow=$stmt->fetch(PDO::FETCH_ASSOC);
if (password_verify($password, $userRow['password'])) {
$_SESSION['user_session'] = $userRow['id'];
$_SESSION["result"]='You have succesfully logged in your profile!';
return true;
}else{
return false;
}
}
catch(PDOException $e)
{
echo $e->getMessage();
}
}
我的数据库字段是 25 个字符长。这里有什么问题?
根据 password_hash()
[...] Therefore, it is recommended to store the result in a database column that can expand beyond 60 characters (255 characters would be a good choice)
这意味着如果您有一个长度为 59 或更短的列,password_verify()
将默默地失败。因为 MySQL 会在您不说任何内容的情况下插入散列密码时截断散列字符串。
解决方案是将 password
列的长度设置为 60 或更高 - 手册建议将其设置为 255,所以就这样做吧。
任何已存储的密码都不会修复其哈希值,因此需要更新或重新插入。