6

默认情况下,CakePHP 似乎使用 SHA1 算法对密码进行哈希处理,并且似乎只提供 SHA256 作为替代方案:

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

在公开我的应用程序之前,我想切换到更安全的密码哈希解决方案,以免将来切换到更安全的哈希算法时遇到麻烦。我四处寻找一些关于使用 bcrypt 或类似东西的指南,但它们似乎都适用于旧版本的 Cake,或者散列的实现很差。

是否有指南可以向我展示如何在不更改模型或控制器中的任何代码的情况下集成更好的密码散列?

还有一个小问题,为什么 Cake 开发者在他们的版本中只包含 SHA 密码散列?众所周知,SHA 是一种损坏的密码散列算法,在我看来,这样一个有声望的框架不会忽视这一点。

4

1 回答 1

7

这张票中,CakePHP 贡献者 Mark Story 提到,bcrypt 将在 CakePHP 2.3(尚未发布)中得到支持,并将成为 3.0 中的标准/默认值。

此外,在这篇博文中, 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.
    )
);

最后更新 User 模型的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;
    }

}
于 2012-07-27T05:27:13.630 回答