このチケットの中で、 CakePHPの寄稿者であるMark Storyは、bcryptがCakePHP 2.3(まだリリースされていない)でサポートされ、3.0で標準/デフォルトになると述べています。
また、このブログ投稿で、 MarkはCakePHP2.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;
}
}