【问题标题】:Phalcon PHP Password BcryptPhalcon PHP 密码 Bcrypt
【发布时间】:2014-01-30 21:03:29
【问题描述】:

所以,我已经在我的 di 中设置了安全组件……

--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'));

我错过了什么???

【问题讨论】:

  • 如果我没有提供足够的信息,请告诉我。
  • 仅供参考:您不需要echo var_dumpvar_dump 不返回任何内容,它会打印到屏幕上。
  • 我意识到了这一点,但是我已经在控制器和模型中输入了 var_dump 来调试它,并且已经有一条回显线......它适得其反,但对于调试来说,它没有害处.至少,我认为不会,但很好。
  • 没什么坏处,只是想指出来:)
  • @JustinE 作为健全性检查,您可以尝试运行this script。如果从中得到两个真值,则问题可能是由代码中的其他内容引起的。

标签: php phalcon


【解决方案1】:

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

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

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

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

【讨论】:

  • 使用这条线有什么意义 $password = $pass; ?谢谢
  • 这是一个更复杂的散列算法的一部分,它在 php 散列后应用于密码。为了简化问题,我省略了这些细节。它不会造成伤害,并且几乎不需要处理能力。
  • 我也在为我的 api 使用 Bcrypt,但是在我设置了 di 并使用 $password_hash = $this->security->hash($password);回声 json_encode($password_hash);它没有回应任何东西,只是空白。但是当我使用 sha1 时,它会回显正确的哈希值。我做错什么了吗?谢谢
【解决方案2】:

这可能与Security::checkHash returns true when using with a non-bcrypt hash有关,前几天已经修复。

看代码,问题可能出在这个块上,你能验证一下用户模型是否被加载,他的哈希密码也被加载了吗?

$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; } 并添加返回$user->password,它会回显散列密码。
  • 与我的问题不完全相关,因为我是肯定的,并且已经验证它从数据库中获取了正确的哈希值。
【解决方案3】:

如果有人来到这里,但上面的答案似乎都没有帮助,而你一直觉得自己越来越笨,请检查用户表中的密码列长度!!。在我的例子中,它是一个 varchar(50) 并且散列给你 60 个字符。

这样做(如上所示)http://pastebin.com/6tNRgyXg,帮助我意识到除了代码之外的其他东西是错误的。

【讨论】:

  • 我的密码长度设置为 varchar 的最大长度,即 255 个字符,所以这不是问题。检查仍然是一件好事...+1
猜你喜欢
  • 2014-06-19
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 2019-01-09
  • 1970-01-01
  • 2016-10-20
  • 2017-12-13
相关资源
最近更新 更多