10

私の目標は、すべてのユーザーに使用するのではなく、ユーザーごとに固有のソルトを用意するConfigure::read('Security.salt')ことです。

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

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

$this->Auth->login()パスワードハッシュのカスタムメソッドを使用するにはどうすればよいですか?

ありがとう。

更新:私はハンニバル・レクター博士の答え(カスタム認証オブジェクトの作成)に行き着きました。方法は次のとおりです。

古いコード:

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

新しいコード(「フォーム」を「カスタム」に変更):

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

「app/Controller / Component / Auth / CustomAuthenticate.php」を作成し、次のようにします。

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

class CustomAuthenticate extends FormAuthenticate {
}

「lib/Cake / Controller / Component / Auth / BaseAuthenticate.php」から「_findUser」メソッドと「_password」メソッドをコピーして、「CustomAuthenticate」クラスに貼り付けます。次に、「_findUser」メソッドに次の2つの変更を加えます。

  1. 「$conditions」配列から次の行を削除します。$model . '.' . $fields['password'] => $this->_password($password),

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

次に、「_password」メソッドに次の2つの変更を加えます。

  1. protected function _password($password) {次のように変更して、「$id」パラメータを作成しますprotected function _password($password, $id) {

  2. return Security::hash($password, null, true);に変更してソルト値を更新しますreturn Security::hash($password, null, Configure::read('Security.salt') . $id);

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

4

4 に答える 4

4

おそらくカスタム認証オブジェクトを作成し、パスワードを好きなようにハッシュすることができます。既存の認証オブジェクトを調べて、それらがどのように機能するかについての一般的な考えを理解してください。

于 2012-07-16T20:38:48.280 に答える
1

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

于 2012-07-16T18:28:14.837 に答える
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 テーブルの「salt」という名前の新しいフィールドに保存します。コードはすでにユーザー ID を提供しているため、必要に応じていつでもソルトを保存/検索できます。

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

CakePHP の開発者である Mark Story が、CakePHP の Auth で bcryptを実装する方法に関するブログ エントリを投稿しました。

コメント セクションで、Mark Story は、CakePHP 2.3 には bcrypt ハッシュを生成するいくつかの新しい組み込み機能があるとコメントしました。

于 2012-08-14T12:50:42.037 に答える
0

設定値のソルトは常に同じですが、少なくとも Cake 2.3 では固有のソルトがすでに使用されています。これが古いバージョンにも当てはまるかどうかはわかりません。

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

于 2013-03-08T17:10:08.533 に答える