php版本5.4.16的密码验证显示无效


password verify gives out invalid with php version 5.4.16

我确实有一个旧版本的php,它是5.4.16,我下载了来自github 的password.php

这使得password_hash()可以完美地工作。我还将它插入到数据库中,但当我尝试使用password_verify()时,它会无效。我只想从数据库中提取一行数据,为自己创建一些东西以登录。

我的数据库是(数据库运行良好,因为在我尝试添加登录之前,我有一个列表,它从同一个数据库中提取数据,只是不同的表,运行良好)

$db = new PDO('mysql:dbname=database;host=hostip', 'root', 'password'); 

我在php中创建了这个,以便插入到我的表中的一行中

/*Inserts*/
$password = password_hash('asdf', PASSWORD_BCRYPT, array('cost' => 10));
$username = 'admin';
$insertQuery = $db->prepare("
        INSERT INTO et_todo (username, password)
        VALUES (:username, :password)
    ");
$insertQuery->execute(array(
        'username' => $username,
        'password' => $password
    ));

为了验证我做了这个

/* Selects */
$selectQuery = $db->prepare("
        SELECT id, username, password
        FROM et_todo
        WHERE id = :id
    ");
$selectQuery->execute(array(
        'id' => 9  //should be 1 but 9 because I tried few testings 
    ));
$rows = $selectQuery->rowCount() ? $selectQuery : array();
foreach ($rows as $row)
{
        if (password_verify('asdf', $row['password'])) {
        /* Valid */
        echo 'valid';
    } else {
        /* Invalid */
        echo 'invalid';
    }
}

不过我得到的是无效的。我不明白自己做错了什么。我的查询错了吗?

p.S。如果我运行了几次插入,数据库中的哈希密码每次都是不同的,即使密码总是"asdf"(如下所述,这是正常的,但只是试图提供尽可能多的信息)


将$selectQuery更改为$selectQuery->fetchAll(PDO::FETCH_ASSOC),因此我删除了foreach循环和代码,如下所示,但通过仍然无效

$rows = $selectQuery->rowCount() ? $selectQuery->fetchAll(PDO::FETCH_ASSOC) : array();
echo $rows[0]['password'] . '<br>';
if (password_verify('asdf', $rows[0]['password'])) {
    /* Valid */
    echo 'valid';
} else {
    /* Invalid */
    echo 'invalid';
}

$selectQuery变量是一个PDOStatement对象,在这种情况下,这就是您对变量行的分类。而是将$selectQuery切换到$selectQuery->fetchAll()。

$rows = $selectQuery->rowCount() ? $selectQuery : array();

应该是

$rows = $selectQuery->rowCount() ? $selectQuery->fetchAll() : array();

PHP-密码验证问题

我终于在这条线索中找到了答案。在我的数据库中,我有varchar50作为密码,我认为这已经足够好了,并使用strlen检查数据库中已经存在的密码的长度,它的长度是50。但是在我更改为varchar255并运行另一个插入并检查新插入的最新长度后,长度为60!然后我重新运行脚本,最终获得了有效!!