PHP password_hash 和 password_verify 未验证的奇怪问题

PHP password_hash and password_verify weird issue not verifying

这是我的场景:

我有一个函数可以在被调用时给出 json 响应。它在包含 Signup.class.php 的 class 内部,其中包含 Signup class。如上所示,在 gen_hash() 函数内部访问 GET 参数 pass 的位置。代码如下。

代码在 https://api1.selfmade.ninja/api/gen_hash?pass=hellooo

上线
        private function gen_hash(){
            if(isset($this->_request['pass'])){
                $s = new Signup("", $this->_request['pass'], "");
                $hash = $s->hashPassword();
                $data = [
                    "hash" => $hash,
                    "info" => password_get_info($hash),
                    "val" => $this->_request['pass'],
                    "verify" => password_verify($this->_request['pass'], $hash),
                    "spot_verify" => password_verify($this->_request['pass'], password_hash($this->_request['pass'], PASSWORD_BCRYPT))
                ];
                $data = $this->json($data);
                $this->response($data,200);
            }
        }

这个函数调用了Signup.class.php,代码如下:

<?php

require_once('Database.class.php');

class Signup {

    private $username;
    private $password;
    private $email;

    private $db;

    public function __construct($username, $password, $email){
        $this->db = Database::getConnection();
        $this->username = $username;
        $this->password = $password;
        $this->email = $email;
    }

    public function getInsertID(){

    }

    public function hashPassword(){
        //echo $this->password;
        return password_hash($this->$password, PASSWORD_BCRYPT);
    }

}

问题如下:

  1. gen_hash() 中的“spot_verify”数组键具有按预期工作的代码。
  2. 但是 gen_hash() 中的“验证”数组键有一个代码没有按预期工作。无论情况如何,它总是说假话。哈希是从 Signup::hashPassword() 函数生成的。一切都按预期工作。该值设置正确,并从 Signup::hashPassword() 中传递给 password_hash 函数。但是在“验证”下的 gen_hash() 中,它只是告诉 false.

代码在 https://api1.selfmade.ninja/api/gen_hash?pass=hellooo

上线

它给出了以下答案,没有任何意义。为什么验证为假?:

{
    "hash": "y$Y3bq8EzFmEpgM6zZqONeeeP3gaUkSClyjmS3NCWxrpFS6R8okRHJG",
    "info": {
        "algo": "2y",
        "algoName": "bcrypt",
        "options": {
            "cost": 10
        }
    },
    "val": "hellooo",
    "verify": false,
    "spot_verify": true
}

我已经做了什么?我确保将相同的密码值传递给 password_hash 和 password_verify。但这没有意义。我错过了什么?

你在这里多了一个美元符号:

return password_hash($this->$password, PASSWORD_BCRYPT);

你不小心做了一个variable variable。改为这样做:

return password_hash($this->password, PASSWORD_BCRYPT);

请注意,您的代码应该会生成直接指向问题的 PHP 警告。所以...不要禁用它们。