我的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
的散列功能。
解决此问题的最安全,最安全的方法是什么?
答案 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']);
}