在这张票中,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;
}
}