PHP password_verify false negative

时间:2017-08-25 17:31:59

标签: php mysqli passwords php-7.1

背景 - 我花了大约一小时左右查看各个帖子网站等等,看看我的密码检查功能突然停止工作的原因。

每次我尝试使用它时,都会返回false,包括输入的密码是否正确。

我已经回复了我的输入和我的哈希,两者都匹配得很好(通过比较表中的哈希值和回显的哈希值)。

但是,当这些变量通过password_verify时,它会100%返回false。

我认为有什么不对? - 基于a post from an external site,我认为这是由于我的hashedPassword变量被解析的方式。当比较两者时,变量类型出错并返回false。

我的代码和数据库是什么样的? -

users表。包含其他列。

userId | username | password
----------------------------
  1    | example  |  temp1

包含密码检查功能的类。 (已经删除了try / catch)

public function checkPasswordCorrect($username, $password) {  // Returns true is the entered password is correct and false if it isn't.

   // This creates a mysqli context to run the connection through.
   $mysqli = new mysqli($this->dbHost, $this->dbUsername, $this->dbPassword, $this->dbPlusPlus);

   // If there is an error connecting to the database, it will be printed and the process will close.
   if (mysqli_connect_errno()) {
       printf("Connect failed: %s\n", mysqli_connect_error());
       exit();
   }

   $sql = "SELECT password FROM users WHERE username='$username'";
   $result = $mysqli->query($sql);
   $row = $result->fetch_array(MYSQLI_ASSOC);

   $hashedPassword = $row["password"];

   $mysqli->close();

   echo $password."<br>".$hashedPassword."<br>"; // The input is correct and the hash matches that in the table.

   // We return a value of true or false, depending on the outcome of the verification.
   if(password_verify($password, $hashedPassword)) {
       echo "return true";
       return true;
   }          
   else {
       echo "return false";
       return false;
   }
}

通过在使用$hashedPassword之前回显password_verify,通过手动检查哈希匹配,如下面的输出所示。

temp0022
$2y$10$9TgjJzSaqOB
return false

我在问什么? -

  1. 是否有更好的方法来检查密码输入,更具体地说,是我从表中提取信息的方式(必须有一些更简单的方法)。

  2. 变量解析是否应该归咎于?是否有任何我未见过的关于此主题的文档或文章?

  3. 我了解什么? - 我对mysqli的使用令人震惊,我是新手。我也知道有类似的答案,但似乎比某些语法错误更多。

    感谢您抽出宝贵时间提供帮助! :d

      

    对于那些担心我会受到SQL注入攻击的人:我已修改此示例代码   大量使用准备好的陈述。谢谢你的   关注:))

1 个答案:

答案 0 :(得分:4)

检查您的表格结构。您的哈希字段需要长度为60(对于PASSWORD_BCRYPT)或255(对于PASSWORD_DEFAULT)(ref)以保存整个哈希。你从数据库得到的是18个字符长。您可能将其设为VARCHAR(18),因此在保存时会被截断,这就是您没有获得匹配的原因。

编辑:增加了PASSWORD_DEFAULT算法的长度。谢谢@DissPanic。