2012-02-25 115 views
0

我正在使用phpass的bcrypt功能在我的网站上查找密码。 现在,它不会真的有效。试图与CheckPassword函数进行比较将不起作用。我对通过我用来解密哈希的每个函数发出的每个字符串进行了大量调试,并得出结论:由bcrypt生成的哈希值非常随机。所以,新生成的明文密码的哈希将永远不会匹配我的数据库中的密码。真的吗?如果是这样,我该如何让它工作?源代码相当简单。使用bcrypt获取用户密码

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

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

这两行代码是否在同一台服务器上运行?如果您的服务器的PHP配置中无法使用phpass,phpass会自动降级(即不实际使用bcrypt)。 – 2012-02-25 16:24:49

回答

1

编辑: 问题是你有顺序不对,你所需要的密码,然后存储的哈希值。

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

Source

这个问题,因为我之前说的(下)存储的哈希来决定如何散列密码进行比较,从而你的不对了参数顺序会导致失败。从之前

答:

你不解密的哈希,您可以通过相同的方式散列可比数据进行检查。 BCrypt哈希包括哈希,盐和轮次数,所以在检查时应该没有问题。

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

据我所知,你的支票是健全的。问题必须在别处。你确定$user->password实际上包含完整的哈希值吗? BCrypt哈希是60个字符,因此请确保它不被截断。

+0

是的我知道我不解密,我只是用这个词没有很好的理由哈哈。是的,我检查了存储的散列并没有问题。在使用'CheckPassword'时查看结果散列,它显示比较散列从不相同,我想知道什么是错误的,为什么它不会返回一个'true'布尔值。 – casraf 2012-02-25 16:15:53

+0

更新了答案,你的''CheckPassword''的参数顺序错误。 – 2012-02-25 16:21:59

+0

是的!现在工作。奇怪的是,示例文件显示了相反的情况。显然我误解或误解了变量在那里的使用方式。 – casraf 2012-02-25 16:35:18