【问题标题】:php password_hash and password_verify issues no matchphp password_hash 和 password_verify 问题不匹配
【发布时间】:2013-11-08 09:36:23
【问题描述】:

我正在尝试 PHP 5.5 中的一个名为 password_hash() 的新函数。

无论我做什么,$hash 和 $password 都不会匹配。

$password = "test";

$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";



if (password_verify($password, $hash)) {
    echo "Success";
}
else {
    echo "Error";
}

【问题讨论】:

  • 您是否收到任何错误消息、通知或警告?如果直接 echo 变量的输出是什么?
  • password_verify() 返回 1
  • 也许您的 $hash 变量在另一个文件中。
  • 哈希保存在数据库中。我确实有一个 html 表单,我尝试登录只是为了模拟一个简单的登录页面。
  • 根据您所说的,这是您保存/检索代码(到/从数据库)的问题。请也发布该代码...就目前而言,您的代码完全有效。

标签: php passwords php-password-hash


【解决方案1】:

您的代码的问题是您在处理哈希时使用了双引号 " 而不是单引号 '

分配时:

$hash = "$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e";

这让 php 认为你有一个名为 $2y 的变量和另一个名为 $10 的变量,最后是第三个名为 $fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e 的变量。显然不是这样的。

我在打开错误报告时注意到错误:

注意:未定义变量:fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e

被 PHP 抛出。

用单引号替换你所有的双引号来修复。

例如

$hash = '$2y$10$fXJEsC0zWAR2tDrmlJgSaecbKyiEOK9GDCRKDReYM8gH2bG2mbO4e';

将整个哈希视为文字字符串,而不是带有嵌入变量的字符串。

【讨论】:

  • 呵呵...我喜欢这个..我知道..伙计..你救了我的头,我喜欢有时事情会变得如此讽刺。非常感谢,并向我鞠躬……我根本没有那样想……:)
  • 只是添加了一个我遇到的问题:当我在 HTML 上生成密码哈希时,我总是在末尾复制一个空格,所以它从来没有用过。
【解决方案2】:

password_verify() 也有类似的问题。

我的错误是我在数据库中将密码字段声明为varchar(30),但哈希值等于或长于 60 个字符..

【讨论】:

  • 我在某处读到,他们建议数据库字段的长度为 255 个字符以供将来校对。
  • @docesam 我在某处读到密码的数据库字段应该是 TEXT 以供将来校对。
  • 谢谢!我阅读了接受的答案,这不是我的情况。看了你的回答,我立马明白了!再次感谢!
【解决方案3】:

对我来说很好。

<?php

$hash=password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
if (password_verify('rasmuslerdorf', $hash)) {
    echo 'Password is valid!';
} else {
    echo 'Invalid password.';
}
?>

输出:

密码有效!

【讨论】:

  • 尝试保存密码,然后验证。你刚才所做的工作,但那不是可以使用的东西。它只是一个例子。密码需要存储在数据库中,然后进行验证。
  • 从数据库中检索密码并进行比较的方式..您应该发布该代码。
  • 请再次查看我的问题。为了简化问题,我又举了一个例子。
猜你喜欢
  • 1970-01-01
  • 2020-01-21
  • 2016-04-13
  • 2022-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-17
  • 2021-07-26
相关资源
最近更新 更多