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布尔参数 forSecurity::hash告诉 Cake 不要在密码上使用安全盐。

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

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

<?php

// core.php
Configure::write('Security.salt', '');
Configure::write('Security.cipherSeed', '');

?>

...或者只是将它们注释掉。

有没有办法告诉$this->Auth->login()忽略安全盐而不必将它们从core.php. 我仍然想使用AuthComponent::password()其他地方的散列功能。

解决此问题的最安全和最可靠的方法是什么?

4

1 回答 1

3

您可以通过将正确的用户传递给 Auth->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']);
}
于 2012-05-03T06:53:56.010 回答