我一直在搜索和阅读关于我的问题的大约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个字符。这有什么不对?
答案 0 :(得分:3)
根据password_hash()
[...]因此,建议将结果存储在数据库列中,该列可以扩展到超过60个字符(255个字符将是一个不错的选择)
这意味着如果您的列长度为59或更短,password_verify()
将无声地失败。因为当你插入哈希密码而不说任何东西时,MySQL会截断哈希字符串。
解决方案是将您的password
列设置为60或更高的长度 - 手册建议将其设置为255,所以就这样做。
任何已存储的密码都不会修复哈希值,因此需要更新或重新插入。