【问题标题】:password_verify won't work after storing in database存储在数据库中后密码验证将不起作用
【发布时间】:2017-09-03 12:22:56
【问题描述】:

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

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

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

$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 做任何事情(比如转义它)或者你在注册或编辑时对输入的密码做了什么?
  • password 列有多长?如何输入密码?
  • 似乎您对密码进行了转义,从而更改了它的值。密码列的长度至少应为 60
  • @Qirel 25 个符号
  • @Crelix - 数据库中的密码字段应至少为 60 个字符,建议使用 255... 那么用户表中的密码列有多长?

标签: php php-password-hash


【解决方案1】:

按照password_hash()的手册

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

这意味着如果您的列长度为 59 或更短,password_verify() 将静默失败。因为当你插入散列密码时,MySQL 会截断散列后的字符串。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2016-01-15
    • 2018-07-18
    相关资源
    最近更新 更多