phpass CheckPassword使用不同的盐?

时间:2012-08-16 18:15:59

标签: php passwords phpass

我有一个包含用户区和管理区的网站。在管理区域中,我有一个用于创建用户的页面和一个用于创建管理员的页面。在用户和管理员页面上,我使用下面的代码来哈希密码:

$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。

2 个答案:

答案 0 :(得分:2)

  

我认为这可能与腌制有关,因为密码的开头部分看起来是一样的。

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

这可能无法解答您的问题,但希望能为您澄清一些细节,以便您不会错误地查看。


  

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

这取决于使用的哈希函数。在Phpass的作者的文章 How to manage a PHP application's users and passwords 中,给出了以下示例Mysql数据库模式:

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

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

从另一个角度来看,Wordpress也使用Phpass和has the following password column definition

user_pass VARCHAR(64)

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

参见:

答案 1 :(得分:0)

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

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