1

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

$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...
}

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

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

4

2 回答 2

2

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

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

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


我现在将数据库设置为允许 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 特定的。

另见:

于 2012-08-16T18:27:13.880 回答
0

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

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

于 2012-08-16T18:28:51.640 回答