2012-08-16 29 views
1

我有一个用户区和管理区的网站。在管理区域中,我有一个用于创建用户的页面和一个用于创建管理员的页面。在用户和管理员的网页,我用下面的代码以哈希密码: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... 
} 

这完全正常工作。我的用户密码被散列并正确检查密码。我在管理员登录页面上使用相同的代码,但它不起作用。它从数据库中提取正确的信息,但是当使用CheckPassword时,密码不匹配。我认为这可能与腌制有关,因为密码的开始部分似乎是相同的。

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

+5

你为什么使用PHP 4.3? – Martin 2012-08-16 18:17:24

+2

@Martin为什么要这么重要?为什么有人可能被迫使用过时的技术有很多原因。只是帮助OP回答这个问题。 – Matt 2012-08-16 18:19:27

回答

2

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

我不知道为什么你会认为,但是受密码哈希(!)的开头部分应该是相同的。 bcrypt创建的哈希使用模块化crypt格式,该格式不仅包含哈希值,而且还指示所使用的哈希函数,循环次数以及用于创建哈希值的salt。这是相同的部分。见还有一个相关的问题我复制这些信息在从:

这可能不是回答你的问题,但希望澄清一些细节给你,这样你就不会在错误的地方寻找。


我对数据库设置现在允许50个字符。有谁知道最长的散列phpass会产生?

这取决于所使用的散列函数。在这篇文章中How to manage a PHP application's users and passwords通过Phpass的作者,下面的例子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特定的。

看得那么清楚:

0

我想我弄清楚了。存储管理员密码的表不存储整个散列。我不敢相信我之前没有意识到这一点。

我已将数据库设置为允许50个字符。有谁知道最长的散列phpass会产生?

+1

如果您的字段类型为VARCHAR,则将长度设置为255将不会对记录的结果大小产生太大影响。无论如何,CHAR(255)都会分配一个255长的字符串:这是VARCHAR的用途。 – 2012-08-16 18:38:45

+0

@Sean:我已经更新了关于数据库中密码列长度的答案,并且给您另外两个指向phpass网站的链接,这些链接详细解释了所有内容。 – hakre 2012-08-17 09:06:32