使用CakePHP的更安全的散列算法

时间:2012-07-27 04:39:09

标签: php cakephp passwords hash

默认情况下,CakePHP似乎使用SHA1算法来散列密码,并且似乎只提供SHA256作为替代:

http://api.cakephp.org/view_source/security#line-86

我希望在将应用程序公开之前切换到更安全的密码哈希解决方案,以便在切换到更安全的哈希算法时节省未来的麻烦。我已经四处寻找使用bcrypt或类似内容的一些指南,但它们似乎都适用于旧版本的Cake,或者很难实现散列。

是否有某个指南可以告诉我如何在不更改模型或控制器中的任何代码的情况下集成更好的密码哈希?

另外,还有一个小问题,为什么Cake devs在发布时只包含SHA密码哈希?众所周知,SHA是一种破解的密码哈希算法,在我看来,这样一个声誉良好的框架不会忽视这一点。

1 个答案:

答案 0 :(得分:7)

this ticket CakePHP撰稿人Mark Story中提到,CakePHP 2.3将支持bcrypt(尚未发布),并将成为3.0中的标准/默认值。

此外,在this blog post Mark中谈到在CakePHP 2.0中使用bcrypt需要进行哪些更改。虽然需要更改您的用户模型,但似乎相对较小。

借用该帖子中的代码,Mark所做的是创建了FormAuthenticate的子类:

<?php
App::uses('FormAuthenticate', 'Controller/Component/Auth');

class BcryptFormAuthenticate extends FormAuthenticate {

/**
 * The cost factor for the hashing.
 *
 * @var integer
 */
    public static $cost = 10;

/**
 * Password method used for logging in.
 *
 * @param string $password Password.
 * @return string Hashed password.
 */
    protected function _password($password) {
        return self::hash($password);
    }

/**
 * Create a blowfish / bcrypt hash.
 * Individual salts could/should used to be even more secure.
 *
 * @param string $password Password.
 * @return string Hashed password.
 */
    public static function hash($password) {
        $salt = substr(Configure::read('Security.salt'), 0, 22);
        return crypt($password, '$2a$' . self::$cost . '$' . $salt);
    }
}

然后更新了控制器组件数组:

<?php
public $components = array(
    'Auth' => array(
        'authenticate' => 'BcryptForm',
        // other keys.
    )
);

最后更新用户模型的beforeSave回调:

<?php
App::uses('BcryptFormAuthenticate', 'Controller/Component/Auth');

class User extends AppModel {
    function beforeSave() {
        if (isset($this->data['User']['password'])) {
            $this->data['User']['password'] = BcryptFormAuthenticate::hash($this->data['User']['password']);
        }
        return true;
    }

}