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は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;
    }

}
于 2012-07-27T05:27:13.630 に答える