4

パスワードを安全にリセットするための強力なアルゴリズムの開発に取り組んでおり、ユーザー コミュニティからのフィードバックを求めています。これまでに私が思いついたものは次のとおりです(ナンス付きのメールでのアクティベーション/登録/パスワードリセットリンクのベストプラクティスからの助けを借りて)

パスワード リセット プロセスは次のように機能します。ユーザーが「パスワードのリセット リンクをメールで送信する」ことを要求すると...

  1. $ソルトを生成する
  2. 「パスワードのリセット」リンクを送信したい $email アドレスの入力をユーザーに求めます。
  3. $key を取得します (= ユーザーが生まれた都市や SSN#Last4 など、ユーザーのみが知っている秘密のユーザー定義の機密アカウント データ)
  4. $ nonce = hash($email . $key) を作成します。
  5. テーブルに保存:
    • $nonce (PK)
    • $ソルト
    • $exp_date
  6. $hash =hash($salt . $email . $key) を作成します。
  7. パスワードをリセットするためのリンク @ URL=...?hash=$hash をユーザーにメールで送信します

ユーザーが送信したリンクをクリックすると、次のフォームが表示されます。

  • $メールを入力してください
  • $新しいパスワードを入力してください
  • $newPassword の確認
  • キーフィールドのプロンプト... 例: 「あなたが生まれた都市を入力してください:」 $key を入力してください

ユーザーがこのフォームを送信すると...

  1. URL から $hash を取得する
  2. $nonce = hash($email . $key) を再作成します
  3. $nonce を使用して、テーブルから $salt を取得します (有効期限が切れていない場合)。
  4. もし hash($salt . $email . $key) == $hash from URL, then Validation is GOOD!, so we... Update the user's password in the URL
  5. そうでない場合、パスワードの変更を拒否します

ノート:

  • すべての $email および $key 応答は、混乱を避けるために処理前にトリミングおよび小文字化されます。
  • 定期的なメンテナンス タスクの sproc は、テーブルをクリーンに保つために、期限切れのナンスをすべて定期的に削除する必要があります。

どう思いますか?

4

1 に答える 1

0

いくつかの問題。nonce を DB に保存すると、nonce の意味が完全に失われ、アプリケーション全体のセキュリティが弱まります。データベースにアクセスすると、アカウントに使用した「ランダムな」ソルト値がわかっているため、ソルトを保存することでセキュリティが低下し、レインボーテーブル攻撃にさらされることになります。

ユーザーがこのフォームを送信すると...

Retrieve $hash from the URL
Recreate $nonce = hash($email . $key)
Use $nonce to retrieve $salt from our table (if unexpired).
If hash($salt . $email . $key) == $hash from URL, then the Validation is GOOD!, so we... Update the user's password in the database
Otherwise, we refuse the attempt to change the password

上記は壊れています。ナンスを保存しているため、アプリケーションのセキュリティが低下していることを知っています。さらに、ソルトも保存することで、セキュリティも弱体化しています。上記のシナリオを考えると、ソルトを取得し、電子メール + ハッシュ アルゴリズムを使用している場合はナンスを推測することができます (アルゴリズムを知っていると仮定する必要があります)。したがって、データベース全体を「すばやく」壊すことができます。

于 2012-02-15T02:49:41.860 に答える