【问题标题】:Using bcrypt for user passwords使用 bcrypt 作为用户密码
【发布时间】:2025-12-31 00:45:12
【问题描述】:

我正在使用phpass 的 bcrypt 功能在我的网站上散列密码。 现在,它真的行不通了。试图与CheckPassword 函数进行比较是行不通的。我对通过我用来解密哈希的每个函数输出的每个字符串进行了大量调试,得出的结论是 bcrypt 生成的哈希是非常随机的。因此,新生成的明文密码哈希永远不会与我数据库中的哈希匹配。真的吗?如果是这样,我到底要如何让它工作?源码比较简单。

// when creating user 
<db insert code>$hash->HashPassword($_POST['password']);

// when logging in
return $hash->CheckPassword($user->password, $_POST['password']);

【问题讨论】:

  • 这两行代码是在同一台服务器上运行的吗?如果您的服务器的 PHP 配置中没有 phpass,它会自动降级(即,实际上不使用 bcrypt)。

标签: php bcrypt


【解决方案1】:

编辑: 问题是您的顺序错误,您需要密码,然后是存储的哈希。

$check = $hasher->CheckPassword($password, $stored_hash);

Source

这很重要,正如我之前(下文)所说,存储的哈希用于决定如何对密码进行哈希比较,因此您错误的参数顺序将导致失败。

之前的回答:

您不会解密哈希,而是通过以相同方式对可比较数据进行哈希来检查它。 BCrypt哈希包括哈希、盐和轮数,所以检查这个应该没有问题。

哈希值永远不会相同的原因是盐每次都会不同。这是为了防止彩虹表攻击。

据我所知,您的检查是正确的。问题一定出在其他地方。您确定 $user-&gt;password 实际上包含完整的哈希吗? BCrypt 哈希是 60 个字符,因此请确保它没有被截断。

【讨论】:

  • 是的,我知道我不会解密,我只是无缘无故地使用这个词哈哈。是的,我检查了存储的哈希,没关系。在使用CheckPassword 时查看结果哈希,它显示比较的哈希永远不会相同,我想知道出了什么问题以及为什么它永远不会返回 true 布尔值。
  • 已更新答案,您的CheckPassword 的参数顺序错误。
  • 是的!现在工作。奇怪的是,示例文件以相反的方式显示了它。显然我误读或误解了变量的使用方式。