phpass CheckPassword 使用不同的盐



我有一个带有用户区域和管理区域的网站。在管理区域,我有一个用于创建用户的页面和一个用于创建管理员的页面。在用户和管理员页面上,我使用以下代码对密码进行哈希处理:

$hasher = new PasswordHash(8, false);
$password = $HTTP_POST_VARS['password'];
$hash = $hasher->HashPassword($password);
$HTTP_POST_VARS['password'] = $hash;

对于用户页面,检查密码的代码是:

$hasher = new PasswordHash(8, false);
$check = $hasher->CheckPassword($password, $arrData[$conf['PASSWORD']['FIELD']]);
if ($check) {
    //login...
}

这完美地工作。我的用户密码经过哈希处理,它会正确检查密码。我在管理员登录页面上使用相同的代码,但是,它不起作用。它从数据库中提取正确的信息,但是当使用密码查核时,密码不匹配。我认为这可能与腌制有关,因为密码的开头部分似乎是相同的。

顺便说一下,我使用的是PHP 4.3。

我认为这可能与腌制有关,因为密码的开头部分似乎是相同的。

我不知道你为什么会这么想,但是密码哈希(!)的开头部分应该是相同的。bcrypt 创建的哈希使用模块化 crypt 格式,该格式不仅包含哈希值,还包含所用哈希函数、轮数和用于创建哈希值的盐的指示器。这是相同的部分。另请参阅我从以下位置复制此信息的相关问题:

  • Phpass - 无法访问所有密码的危险?

这可能无法回答您的问题,但希望能为您澄清一些细节,以免您看错地方。


我现在将数据库设置为允许 50 个字符。有谁知道最长的哈希phpass会生成?

这取决于使用的哈希函数。在 Phpass 作者的《如何管理 PHP 应用程序的用户和密码》一文中,给出了以下示例 Mysql 数据库模式:

create database myapp;
use myapp;
create table users (user varchar(60), pass varchar(60));

你看这里,这是一个VARCHAR(60).这意味着最多 60 个字符就足够了。

从另一个角度来看,Wordpress也使用Phpass,并具有以下密码列定义:

user_pass VARCHAR(64)

这意味着 64 个字符对他们来说应该足够了。但是请记住,Wordpress也支持其他哈希,所以这可能只是一个通用值,而不是Phpass特定的值。

另请参阅:

  • 可移植的PHP密码哈希框架(我会说这是最低的必读内容,如果您想了解更多信息,请阅读它)
  • 可移植 (PHPass) 密码哈希。我应该使用它们吗?
我想

我想通了。存储管理员密码的表未存储整个哈希。我不敢相信我没有意识到这一点。

我现在将数据库设置为允许 50 个字符。有谁知道最长的哈希phpass会生成?

最新更新