パスワードを安全にリセットするための強力なアルゴリズムの開発に取り組んでおり、ユーザー コミュニティからのフィードバックを求めています。これまでに私が思いついたものは次のとおりです(ナンス付きのメールでのアクティベーション/登録/パスワードリセットリンクのベストプラクティスからの助けを借りて)
パスワード リセット プロセスは次のように機能します。ユーザーが「パスワードのリセット リンクをメールで送信する」ことを要求すると...
- $ソルトを生成する
- 「パスワードのリセット」リンクを送信したい $email アドレスの入力をユーザーに求めます。
- $key を取得します (= ユーザーが生まれた都市や SSN#Last4 など、ユーザーのみが知っている秘密のユーザー定義の機密アカウント データ)
- $ nonce = hash($email . $key) を作成します。
- テーブルに保存:
- $nonce (PK)
- $ソルト
- $exp_date
- $hash =hash($salt . $email . $key) を作成します。
- パスワードをリセットするためのリンク @ URL=...?hash=$hash をユーザーにメールで送信します
ユーザーが送信したリンクをクリックすると、次のフォームが表示されます。
- $メールを入力してください
- $新しいパスワードを入力してください
- $newPassword の確認
- キーフィールドのプロンプト... 例: 「あなたが生まれた都市を入力してください:」 $key を入力してください
ユーザーがこのフォームを送信すると...
- URL から $hash を取得する
- $nonce = hash($email . $key) を再作成します
- $nonce を使用して、テーブルから $salt を取得します (有効期限が切れていない場合)。
- もし hash($salt . $email . $key) == $hash from URL, then Validation is GOOD!, so we... Update the user's password in the URL
- そうでない場合、パスワードの変更を拒否します
ノート:
- すべての $email および $key 応答は、混乱を避けるために処理前にトリミングおよび小文字化されます。
- 定期的なメンテナンス タスクの sproc は、テーブルをクリーンに保つために、期限切れのナンスをすべて定期的に削除する必要があります。
どう思いますか?