2012-07-16 7 views
10

私の目標は、すべてのユーザーにConfigure::read('Security.salt')を使用するのではなく、各ユーザーに固有の塩を持たせることです。CakePHP 2:AuthComponentの「パスワード」メソッドをオーバーライド

私はCakePHP 2.xがパスワードを自動的にハッシュしないことを知っています。これにより、パスワードのモデル検証を行うことができます。これは非常にうれしいことです。しかし、AuthComponentの「パスワード」メソッドをオーバーライドできる方法はありません。したがって、パスワードをデータベースに保存する前にパスワードをハッシュする方法を制御することはできますが、実際のログインを実行する際にパスワードがハッシュされる方法を制御することはできません。料理本から:

$this->Auth->login()を呼び出す前にパスワードをハッシュする必要はありません。

$this->Auth->login()はパスワードハッシュのカスタムメソッドを使用するために何ができますか?

ありがとうございました。

UPDATE:私はdrハンニバルレクターの答え(カスタム認証オブジェクトの作成)に行きました。ここでそれを行う方法は次のとおりです。

旧コード:

$this->Auth->authenticate = array('Form' => array('fields' => array('username' => 'email'))); 

新しいコード(変化する "フォーム" を "カスタム"):

$this->Auth->authenticate = array('Custom' => array('fields' => array('username' => 'email'))); 

の作成「アプリ/コントローラ/コンポーネント/認証/ CustomAuthenticate.phpは "と、それは次のようになります

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

class CustomAuthenticate extends FormAuthenticate { 
} 

コピー "のlib /ケーキ/コントローラ/ COM _findUser" と "_password" からメソッド" ponent/Auth/BaseAuthenticate.php "を開き、" CustomAuthenticate "クラスに貼り付けます。そして、 "_findUser" メソッドに次の2つの変更を行います。 "$条件" 配列からこの行を削除し

  1. if (empty($result) || empty($result[$model]) || $result[$model][$fields['password']] != $this->_password($password, $result[$model]['id'])) {

  2. に変更 if (empty($result) || empty($result[$model])) { $model . '.' . $fields['password'] => $this->_password($password),

を次に作ります「_パスワード」メソッドの次の2つの変更点があります。

  1. と同じロジックでSecurity::hashを使用するAuthComponent::passwordのすべてのオカレンスを更新し、最後に

return Security::hash($password, null, Configure::read('Security.salt') . $id);return Security::hash($password, null, true);を変更することにより、 protected function _password($password) {更新

  • protected function _password($password, $id) {への塩の値を変更することによって、「$ ID」パラメータを作成します。上記。

    答えて

    4

    おそらくcustom auth objectを作成し、パスワードをハッシュすることができます。彼らがどのように働くかの一般的な考えを得るためにexisting auth objectsを見てください。

    +0

    それは働いた!私は関連するコードで私の質問を更新しました。ありがとう! – Nick

    1

    Auth-> login()呼び出しを使用するのではなく、モデル内の現在の実装のコードを使用すると考えましたか? (http://api20.cakephp.org/view_source/auth-component#line-506)必要に応じてこれを書き直すことができます。

    +0

    私はそれをどうやってやっていくのか分かりませんし、これを行うには非常に開発者に優しい方法のようには見えません。各ユーザーに固有の塩を持つことは、間違いなく珍しい目標です。いくつかのサンプルコードがありますか?いずれにせよ、私はあなたの時間を感謝します – Nick

    1

    パスワードをハッシュする方法(パスワードの例を参照)は、各パスワードのソルトが正しい理由を知りたい方は、http://crackstation.net/hashing-security.htmをご覧ください。

    ここに掲載されたコードのほんの少しの改善は、私が直前にリンクした記事のアドバイスを受けて、「新しいランダムソルト」を生成することです。ユーザーがアカウントを作成するか、 "

    ここに掲載されている実装は、オリジナルのAuthのハードコードされた静的な塩とユーザーIDの組み合わせを塩として使用します。つまり、パスワードを変更するたびに同じ塩が各ユーザーに再利用されます。したがって、このハッシュ・ガイドの推奨事項に従うには、ユーザーがパスワードを作成/変更するたびに新しいランダム・ソルトを生成し、ハッシュ・パスワードとともにその固有のソルトをユーザー表に保管する必要があります。

    define("PBKDF2_SALT_BYTES", 24); 
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM)); 
    

    と慣例により

    は、「塩」という名前の新しいフィールドにusersテーブルに格納します。

    は、あなたはそれらのランダムなソルト・ジェネレータを使用することができます。コードはすでにユーザーIDを提供しているので、必要に応じていつでも塩を保存/参照することができます。

    この記事では、「キーストレッチ」と呼ばれる手法を使用する「低速ハッシュ関数」と、PBKDF2やbcryptなどの標準アルゴリズムを使用して実装する方法についても説明します。セキュリティを強化するためにカスタムAuth実装にコピーして貼り付けることができるPHPコードの例が提供されています。

    CakePHPの開発者マーク・ストーリーはコメント欄にはどのようにimplement bcrypt in CakePHP's Auth

    上のブログエントリを掲載している、マーク・ストーリーは、CakePHP 2.3はbcryptのハッシュを生成するために、いくつかの新しい組み込み機能を持っているだろうとコメントしました。

    0

    ケーキ2.3でも、あなたの設定値の塩は常に同じですが、ユニークな塩がすでに使用されています。これが古いバージョンでも当てはまるのかどうかはわかりません。

    また、Configure :: write( "Security.salt"、$ superAwesomeUserSpecificSalt)を使用して、UserモデルのbeforeSave()関数で塩を変更することもできます。

    関連する問題