我的 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()
其他地方的散列功能。
解决此问题的最安全和最可靠的方法是什么?