php password_verify 不起作用

标签 php password-hash

<分区>

这应该非常简单:我正在生成一个散列密码,然后想将它与“未散列”字符串进行比较。它总是返回无效的密码。我错过了什么?

<?php

// MY CURRENT PHP VERSION IS 7.0.9

$password = "abc";

$options = [
    'cost' => 11,
    'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
$password_hashed = password_hash($password, PASSWORD_BCRYPT, $options)."\n";

if (password_verify($password, $password_hashed)) {
    echo '<strong>correct password.</strong><br>';
} else {
    echo '<strong>invalid password!</strong><br>';
}


?>

最佳答案

您的问题是您在散列字符串的末尾添加了换行符。

$password_hashed = password_hash($password, PASSWORD_BCRYPT, $options)."\n";
//                                                                       ^
//                                          Here you add a newline ------'

这意味着您对密码进行哈希处理,并在哈希字符串的末尾添加一个换行符。当您现在通过 password_verify() 与未散列的字符串进行比较时,它不会匹配 - 仅仅是因为该换行符。要解决此问题,您需要从散列密码的位置删除 ."\n",使其...

$password_hashed = password_hash($password, PASSWORD_BCRYPT, $options);

换行符可能来自 PHP 手册,其中显示了散列密码的示例。不幸的是,它具有误导性——我认为应该从示例中删除。

作为最后的说明,来自手册。

Warning
The salt option has been deprecated as of PHP 7.0.0. It is now preferred to simply use the salt that is generated by default.

关于php password_verify 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46266589/

相关文章:

php - cURL像iframe一样获取页面内容

php - 生成 HTML 以显示具有正确类型(文本、复选框等)的自定义问题并正确添加所需的属性

security - 客户端密码哈希与纯文本

php - 为什么我的 binary(64) 60 字符密码哈希在 phpmyadmin 中显示为 60 个字符,但在导出时最后有四个 '\0'?

php - 为什么password_verify返回false?

php - Magento : showing sub sub categories in same order as in admin backend tree structure

php - 多步搜索在 codeigniter 中不起作用

php构造函数继承

php - Laravel Voyager 中的密码哈希方法是什么?

php - 如何使用PHP的password_hash来哈希和验证密码