【问题标题】:PHP: Password HashingPHP:密码散列
【发布时间】:2015-08-13 02:53:32
【问题描述】:

我已经开始使用 password_hash() 进行密码散列。我遇到的问题是,当我使用 password_verify() 检查输入值是否与存储在数据库中的散列密码匹配时,每次它都返回 false。

  $password = "test";

  $query = "SELECT password FROM user WHERE password = :pass ";
  $statement = $connection->prepare($query);
  $statement->bindParam(":pass", $password);
  $statement->execute(); 

   if(password_verify($password, $row['password'])){
    echo "Password Valid";
   }

   else {
    echo "Invalid Password";
   }

但是,例如,如果我从数据库中复制一个哈希密码值并将其放在 $row['password'] 的位置,并且当我测试代码时,它会返回 true。

   if(password_verify($password, '$2y$10$kc09i9YSP.ExmUquMqRnf......')){
    echo "Password Valid";
   }

请帮忙。

【问题讨论】:

标签: php hash


【解决方案1】:

替换:

$statement->bindParam(":pass", $password);

与:

$statement->bindParam(":pass", password_hash($password, PASSWORD_DEFAULT));

请使用 Joel Hinz 的回答

【讨论】:

    【解决方案2】:

    第一个问题是您尝试使用 SQL 来查找散列密码。标准过程是找到具有给定用户名的用户,并获取该用户的密码以便进行验证。

    您的另一个问题是调用 $row['password'] 但您尚未在代码中实际设置它。先取行,再验证密码。

    这样的事情应该可以工作:

    $username = "test";
    
    $query = "SELECT password FROM user WHERE username = :username ";
    $statement = $connection->prepare($query);
    $statement->bindParam(":username", $username);
    $statement->execute();
    $row = $statement->fetch();
    
    if(password_verify($password, $row['password'])){
        echo "Password Valid";
    }
    else {
        echo "Invalid Password";
    }
    

    【讨论】:

    • 我很高兴它有帮助! :)
    猜你喜欢
    • 2012-05-30
    • 2011-04-06
    • 2015-10-27
    • 2018-07-29
    • 1970-01-01
    • 2017-06-26
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多