php password_verify不起作用

时间:2017-09-17 16:59:19

标签: 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>';
}


?>

1 个答案:

答案 0 :(得分:6)

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

$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手册,其中显示了散列密码的示例。不幸的是,它具有误导性 - 我认为应该从示例中删除它。

最后一点,来自手册。

  

警告
  自PHP 7.0.0起,salt选项已被弃用。现在最好只使用默认生成的盐。