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,所以就这样做吧。

任何已存储的密码都不会修复其哈希值,因此需要更新或重新插入。