Phalcon PHP 密码 Bcrypt

4
所以,我在我的依赖注入中设置了安全组件,如下所示...
--services.php--
$di->set('security', function(){
    $security = new Phalcon\Security();
    //Set the password hashing factor to 11 rounds
    $security->setWorkFactor(11);
    return $security;
}, true);

--Custom Auth Library (auth.php)--
    $user = Users::findFirstByEmail($login);
    if ($user) {
        if ($this->security->checkHash($password, $user->password)) {
           return true;
        }
    }
    return false;

但是,出于某些原因,这总是返回false...所以为了调试,我尝试使用PHP的password_verify函数,下面的代码直接在我的视图中:

//Returns false
var_dump($this->security->checkHash('password', '$2a$12$aSa7zLEd24zjh2aoUasxd.hbxIm8IQ0/vMf/8p4LTYI3VtZMJ62Pe'));
//Returns True
var_dump(password_verify('password', '$2a$12$aSa7zLEd24zjh2aoUasxd.hbxIm8IQ0/vMf/8p4LTYI3VtZMJ62Pe'));

我错过了什么???

1
FYI:您不需要“echo var_dump”。var_dump不会返回任何内容,它只是打印到屏幕上。 - gen_Eric
我知道这一点,但我已经在控制器和模型中键入了 var_dump 进行调试,并且已经有了一个 echo 行...虽然它会产生反作用,但对于调试来说,它并不会造成伤害。至少我认为不会,但你提出了一个好观点。 - Justin E
你是如何开始哈希密码的?使用 password_hash 还是 $this->security->hash - gen_Eric
我已经完成了这项任务,实际上一开始就是那样设置的,后来我将其调整为11,以查看是否与此有关。 - Justin E
2
@JustinE 作为一种合理性检查,你可以尝试运行这个脚本。如果你从中得到了两个true值,那么你的问题可能是由代码中其他原因引起的。 - Stecman
显示剩余8条评论
3个回答

2

好的,看起来如果我将哈希和密码都设置为变量,它会正确解析这两个语句。

感谢所有的帮助,但这是最终的解决方案。

$password = $pass;
$hash = '$2a$12$lDL2eQ1GLJsJhKgPvU6agOnHpwNSBYPtWHF/O/aTvyISzI.ugjyLC';

var_dump($this->security->checkHash($password, $hash));
var_dump(password_verify($password, $hash));

使用这行代码 $password = $pass; 的目的是什么?谢谢。 - 0xh8h
那是一个更复杂的哈希算法的一部分,应用于php哈希密码之后。为了简化问题,我省略了这些细节。这不会有任何影响,并且几乎不需要处理能力。 - Justin E
我也在我的API中使用Bcrypt,但是在设置了DI并使用$password_hash = $this->security->hash($password);之后,echo json_encode($password_hash);没有输出任何内容,只是空白。但是当我使用sha1时,它会输出正确的哈希值。我做错了什么吗?谢谢。 - 0xh8h

1
如果有人来到这里,之前的回答似乎都没有帮助,你感觉越来越蠢,请检查用户表中密码列的长度!!在我的情况下,它是varchar(50),而哈希值需要60个字符。
执行上述操作(如上所述)http://pastebin.com/6tNRgyXg,帮助我意识到问题不在代码方面。

我的密码长度被设置为一个varchar的最大长度,即255个字符,这不是问题。仍然值得检查一下...+1 - Justin E

1
这可能与Security::checkHash在使用非bcrypt哈希时返回true有关,几天前已经修复了此问题。
从代码来看,问题可能在这个块内,您能验证用户模型是否被加载,以及他的哈希密码是否也被加载了吗?
$user = Users::findFirstByEmail($login);
if ($user) {
    if ($this->security->checkHash($password, $user->password)) {
       return true;
    }
}
return false;

它确实可以,因为我可以删除 if ($this->security->checkHash($password, $user->password)) { return true; } 并添加 return $user->password,这将回显散列密码。 - Justin E
与我的问题不完全相关,因为我很确定并已经验证它从数据库中获取了正确的哈希值。 - Justin E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接