password_verify在数据库中存储后无法正常工作

时间:2017-09-03 12:22:56

标签: php php-password-hash

我一直在搜索和阅读关于我的问题的大约50个帖子,但仍然无法弄清楚我的问题,所以我在这里。

问题:即使密码正确,password_verify()也会返回false。

这是我将密码存储到db中的方式(当注册和编辑配置文件时)

$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个字符。这有什么不对?

1 个答案:

答案 0 :(得分:3)

根据password_hash()

的手册
  

[...]因此,建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择)

这意味着如果您的列长度为59或更短,password_verify()将无声地失败。因为当你插入哈希密码而不说任何东西时,MySQL会截断哈希字符串。

解决方案是将您的password列设置为60或更高的长度 - 手册建议将其设置为255,所以就这样做。

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