在AuthComponent中禁用纯MD5哈希的安全盐?

时间:2012-05-02 23:58:24

标签: cakephp cakephp-2.0 cakephp-2.1

我的CakePHP 2.1应用程序与另一个应用程序共享其用户数据库表。为了使用户能够登录这两个应用程序,需要在普通MD5中对密码字段进行哈希处理。无法更改其他应用或数据库。

我可以通过以下方法将散列算法从SHA1(默认值?)更改为MD5:

<?php
// AppController.php

public function beforeFilter()
{
    Security::setHash('md5');
}
?>

我可以使用普通的MD5密码将新用户添加到系统中:

<?php
// User.php

public function beforeSave()
{
    if (isset($this->data['User']['password']))
    {
        $this->data['User']['password'] = Security::hash($this->data['User']['password'], 'md5', false);
    }
}
?>

请注意false的{​​{1}}布尔参数告诉Cake不要在密码上使用安全盐。

问题出现在身份验证上。当我使用表单身份验证通过Security::hash登录用户时,我相信$this->Auth->login()仍然使用MD5哈希来验证密码,但它仍在应用安全盐。

解决此问题的唯一方法是将Security salt和cipherSeed设置为空字符串:

AuthComponent

......或者只是评论它们。

有没有办法告诉<?php // core.php Configure::write('Security.salt', ''); Configure::write('Security.cipherSeed', ''); ?> 忽略安全盐而不必从$this->Auth->login()删除它们。我仍然希望在其他地方使用core.php的散列功能。

解决此问题的最安全,最安全的方法是什么?

1 个答案:

答案 0 :(得分:3)

您可以通过将正确的用户传递给Auth-&gt; login()函数来手动登录:

$username = $this->request->data['User']['username'];
$password = Security::hash($this->data['User']['password'], 'md5', false);

$user = $this->User->find('first', array('conditions' => array('username' => $username, 'password' => $password)));
if($user !== false)
{
    $this->Auth->login($user['User']);
}