PHP password_verify错误地返回false

时间:2015-10-25 05:14:58

标签: php mysql hash

我已经搜索过这个主题的高低,没有人遇到我遇到的同样问题。

我正在MySQL表中创建一个用户,其密码来自password_hash,强度为10。

我一直在让它进行验证,并制作了一个测试脚本来实际验证我的发现。这是脚本:

public function testAction(){
    $data = new dataHandler;
    $data->table = "access";

    $hash1 = $data->insert(array('email'=>'test6@test.com', 'password'=>'ABC123.abc', 'password_confirm'=>'ABC123.abc', 'alias'=>'ABC123.abc'));

    $res = $data->find(array('email'=>'test6@test.com'));

    $hash2 = $res[0]['hash'];

    $test = password_verify('ABC123.abc', $hash1);
    $test2 = password_verify('ABC123.abc', $hash2);

    var_dump($test);
    echo "<br>";
    var_dump($test2);

    echo "<br><br>";

    echo "Length: " . strlen($hash1) . "<br>{$hash1}<br>Length: " . strlen($hash2) . "<br>{$hash2}";

    die();
}

为了验证我的脚本在存储时没有以某种方式做某些奇怪的事情,我使用我的哈希方法(动态地在insert()方法中调用)直接回显哈希:

public function createHash($password){
    $hash = password_hash($password, HASH);
    echo "Length: " . strlen($hash) . "<br>$hash<br>";
    return $hash;
}

这是insert方法。 cleanData只是unset describe中没有的任何内容 - 它不会改变任何值。警告,目前由于大量调试而非常难看:

public function insert($data){
    if(!is_array($data)){
        return false;
    } else {
        $this->openDb();
        $ins = "";
        $fs = "";

        $data = $this->cleanData($data);

        foreach($data as $key => $field){
            if($key == "password"){
                $auth = new authorization;

                $key = "hash";
                $field = $auth->createHash($field);

                $data['hash'] = $field;



                unset($data["password"]);
            }

            $ins .= ":{$key}, ";
            $fs .= "`{$key}`, ";
            //$data[$key] = $this->DBH->quote($field);
        }

        $ins = rtrim($ins, ", ");
        $fs = rtrim($fs, ", ");

        try {

            # the shortcut!
            $this->DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
            $this->DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
            $STH = $this->DBH->prepare("INSERT INTO `" . $this->table . "` ($fs) value ($ins)");

            $STH->execute($data);

            $id = $this->DBH->lastInsertId();

            $this->closeDb();

            return $data['hash']; //Debugging
            return $id;
        } catch(PDOException $e) {
            $this->errHandler($e->getMessage());
        }
    }
}

现在,这是输出:

Length: 60
$2y$10$wGJxGjK4Lz4FgZ3OZJjBo.9lF7LE90p3Q5inOsBROQTU5FBVdj1LK
bool(true) 
bool(false) 

Length: 60
$2y$10$wGJxGjK4Lz4FgZ3OZJjBo.9lF7LE90p3Q5inOsBROQTU5FBVdj1LK
Length: 60
$2y$10$wGJxGjK4Lz4FgZ3OZJjBo.9lF7LE90p3Q5inOsBROQTU5FBVdj1LK

如您所见,password_verify次尝试都失败了。第一个来自哈希生成而没有任何进一步的操作,第二个来自数据库。

我做错了什么?

我在搜索时唯一能找到的是测试和使用双引号或随机人为错误的人。然而,在我看来,这不是这两者中的任何一个。

1 个答案:

答案 0 :(得分:0)

密码哈希值是空字符串,请自行尝试:

<?php
echo password_verify('', '$2y$10$4Y7kQNP/6XyBtQQ4zPI6ZuaelCjHdWE.kBRTUVk56J7PV4BQYWoUS')?'Y':'N';
?>

确保您将createHash传递给有效的$password