【问题标题】:password_verify doesn't work, even though it has the hash and the user's passwordpassword_verify 不起作用,即使它具有哈希值和用户密码
【发布时间】:2016-04-17 02:54:29
【问题描述】:

我正在为db 中的唯一用户编写登录代码。 但是password_verify 函数似乎不起作用。当我echohash 来自dbpassword 写在表格中时,我看到了它们,所以查询或$_POST 没有问题。

这是我的代码: 登录:

$passwordFromForm = htmlspecialchars($_POST['password']);
$nmbr = 12; // it's the user's id.
$sql = "SELECT * FROM user WHERE iduser = $nmbr";
$res = mysqli_query($conn, $sql);
// $row = mysqli_fetch_assoc($res);
while($row = $res->fetch_assoc()) {
    $hashFromDB = $row['hash'];
}
if(password_verify($passwordFromForm, $hashFromDB)) {
    echo "success";
    header("Location: ../admin.php");
}
else {
    echo "The hash is:" . $hashFromDB . "and the pass is:" . $passwordFromForm;
    //this echoes the correct hash and string
}

提前致谢。

【问题讨论】:

    标签: php login passwords


    【解决方案1】:

    函数password_verify()依赖于password_hash(),可以查看password_hash()使用的算法是否和password_verify()一样,用password_get_info($hash)查看res

    【讨论】:

    • 谢谢!如果password_verify 的hash 和password_hash 的hash 一样?它们是一样的。
    • 这里是密码获取信息:array(3) { ["algo"]=> int(1) ["algoName"]=> string(6) "bcrypt" ["options"]=> 数组(1) { [“成本”]=> int(12) } }
    【解决方案2】:

    在将密码输入password_hash() / password_verify() 函数之前,您不应该对密码进行任何转义。因此,删除对htmlspecialchars() 的调用,并确保保存散列的数据库字段的类型为varchar(255)

    【讨论】:

    • 感谢您的回答。我已经试过不用htmlspecialchars(),数据库是VARCHAR(255),但是还是不行。
    • @TheTryHardz - 你能举一个$hashFromDB的内容的例子吗?
    • 在我的代码中,当我回显 $hashFromDB 时,输出是哈希 $2y$10$oPHWLB.6Z0hBvjk8al24xuiG7Io4l7ERGCtLnW5Eij1wTlT67mLJW。
    • @TheTryHardz - 哈希看起来不错,这意味着 PHP 版本和数据库访问不是问题(我知道您从数据库中读取了值?)。所以唯一可能的问题可能是输入。您说您尝试不使用htmlspecialchars() 功能,您是否在注册表中也将其删除并在测试登录之前存储了新密码?
    • martinstoeckli,我做到了,但什么也没发生。最终通过基本上重建登录来解决问题。从来没有新的问题。
    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2017-11-22
    • 2013-05-05
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多