165

「パスワードを忘れた」機能を実装するための最良の方法を探しています。

私は2つのアイデアを思いつきます:

  1. ユーザーが [パスワードを忘れた場合] をクリックすると、ユーザーはユーザー名、電子メール、生年月日または姓をキー入力する必要があります。その後、一時パスワードが記載されたメールがユーザーのメール アカウントに送信されます。ユーザーは一時パスワードを使用してログインし、パスワードをリセットします。

  2. 同様ですが、電子メールには、ユーザーが自分のパスワードをリセットできるリンクが含まれています。

または、誰かが私にもっと良い安全な方法を提案できますか? また、一時パスワードまたはリンクを送信するか、ユーザーに 24 時間以内にパスワードをリセットするよう強制することも考えています。そうしないと、一時パスワードまたはリンクが使用できなくなります。どうやってするか?

4

10 に答える 10

204

更新: より良いアプローチのために 2013 年 5 月に改訂

  1. ユーザーは自分のユーザー名を入力し、「パスワードを忘れた」をクリックします。ユーザー名も時々忘れてしまうことがあるので、ユーザー名の代わりに電子メール アドレスを入力するオプションもお勧めします。
  2. password_change_requestsシステムには、列IDTimeおよびを含むテーブルがありますUserID。新しいユーザーがボタンを押すと、テーブルにレコードが作成されます。このTime列には、ユーザーが「パスワードを忘れた」ボタンを押した時刻が含まれています。はID文字列です。長いランダムな文字列 (GUID など) が作成され、パスワードのようにハッシュされます(それ自体は別のトピックです)。このハッシュは、テーブルの「ID」として使用されます。
  3. システムは、リンクを含む電子メールをユーザーに送信します。リンクには、元の ID 文字列 (ハッシュ化前) も含まれています。リンクは次のようになりますhttp://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF。forgetpassword.jsp ページは、ID パラメータを取得できる必要があります。申し訳ありませんが、私は Java を知らないので、これ以上具体的に言えません。
  4. ユーザーがメール内のリンクをクリックすると、ページに移動します。ページは URL から を取得し、ID再度ハッシュして、テーブルと照合します。そのような記録が存在し、たとえば 24 時間以上経過していない場合、ユーザーには新しいパスワードを入力するように求めるプロンプトが表示されます
  5. ユーザーが新しいパスワードを入力し、[OK] をクリックすると、誰もが幸せに暮らします... 次回まで!
于 2009-07-09T09:34:59.077 に答える
32

それはすべて、サイトと達成しようとしているセキュリティのレベルによって異なりますが、Web アプリの基本的なプロセスは次のようになります。

  1. ユーザーは「パスワードを忘れた」ページに移動し、ユーザー名または電子メール (どちらか一意のもの) を入力して、パスワードのリセットを要求します。

  2. 必要に応じて、この段階で、事前定義された秘密の質問への回答や生年月日などの追加情報を要求して、要求を確認できます。この追加レベルにより、ユーザーは要求していない電子メールを受信できなくなります。

  3. ユーザーのアカウントを検索します。一時パスワード (通常は GUID) とタイムスタンプをアカウント レコードに対して保存します。一時パスワードを含む電子メールをユーザーに送信します。

  4. ユーザーは、電子メール内の一時パスワードとユーザー ID を含むリンクをクリックするか、「パスワードを忘れた」ページに移動して、一時パスワードと ID をコピー & ペーストします。ユーザーは新しいパスワードを入力して確認します。

  5. ユーザーの記録を調べて、現在の時刻がステップ 2 で保存されたタイムスタンプの指定された時間制限 (たとえば 1 時間) 内にある場合は、新しいパスワードをハッシュして保存します。(明らかに、一時パスワードが一致する場合のみです!)。一時的な GUID とタイムスタンプを削除します。

ここでの原則は、ユーザーがパスワードを変更できるようにする一時パスワードを電子メールで送信することです。最初に保存されたパスワード (ハッシュ化する必要があります) は、ユーザーが覚えている場合に備えて、一時的なパスワードに変更されることはありません。

元のパスワードはハッシュされて不明であるため、ユーザーに表示されることはありません。

このプロセスは、ユーザーの電子メール アカウントのセキュリティに完全に依存していることに注意してください。したがって、達成したいセキュリティのレベルによって異なります。通常、ほとんどのサイト/アプリではこれで十分です。

于 2009-07-09T10:23:24.703 に答える
27

Troy Huntは、彼の記事でいくつかの優れた点を指摘しています。安全なパスワードリセット機能の構築について知りたいと思ったことはすべてあります。最も関連性の高い抜粋は次のとおりです。

[T]ここに2つの一般的なアプローチがあります:

  1. サーバー上で新しいパスワードを生成し、それを電子メールで送信します
  2. リセットプロセスを容易にする一意のURLを電子メールで送信します

それとは反対のガイダンスがたくさんありますが、最初のポイントは実際には私たちがなりたい場所ではありません。これを行う際の問題は、永続的なパスワード(いつでも戻って使用できるパスワード)が安全でないチャネルを介して送信され、受信トレイに存在することを意味します。

..。

ただし、最初のアプローチには、アカウントの悪意のあるロックアウトが非常に簡単になるという大きな問題がもう1つあります。Webサイトでアカウントを所有している人の電子メールアドレスを知っている場合は、パスワードをリセットするだけで、いつでもその人をロックアウトできます。銀の大皿にサービス拒否攻撃が仕掛けられました!これが、リセットがリクエスターの権利を正常に確認した後にのみ発生する必要がある理由です。

リセットURLについて話すときは、リセットプロセスのこの特定のインスタンスに固有のWebサイトアドレスについて話します。

..。

私たちがやりたいのは、リセットURLの一部としてメールで送信できる一意のトークンを作成し、ユーザーのアカウントと一緒にサーバー上のレコードと照合して、メールアカウントの所有者が実際にリセットしようとしていることを確認することです。パスワード。たとえば、トークンは「3ce7854015cd38c862cb9e14a1ae552b」であり、リセットを実行するユーザーのIDおよびトークンが生成された時刻(これについては後で詳しく説明します)とともにテーブルに格納されます。メールが送信されると、「Reset /?id = 3ce7854015cd38c862cb9e14a1ae552b」などのURLが含まれ、ユーザーがこれを読み込むと、ページはトークンの存在を確認し、その結果、ユーザーのIDを確認し、パスワードを許可します。変更されます。

..。

リセットURLでやりたいもう1つのことは、トークンを制限して、リセットプロセスを特定の期間内(たとえば1時間以内)に完了する必要があるようにすることです。

..。

最後に、これが1回限りのプロセスであることを確認します。リセットプロセスが完了したら、トークンを削除して、リセットURLが機能しなくなるようにする必要があります。前のポイントと同様に、これは、攻撃者がリセットされたURLを悪用できるウィンドウが非常に限られていることを確認するためです。さらに、もちろん、リセットプロセスが正常に完了した場合、トークンは不要になります。

彼は、情報漏えい、CAPTCHA、2要素認証、そしてもちろんパスワードハッシュのような基本的なベストプラクティスを回避することについて、さらに多くの良い点を述べています。私は、セキュリティの質問の有用性についてトロイに同意せず、ブルース・シュナイアーの実践に対する懐疑論を好むことに注意することが重要だと思います。

これらすべての質問のポイントは同じです:バックアップパスワード。パスワードを忘れた場合、秘密の質問で身元を確認できるため、別のパスワードを選択するか、サイトに現在のパスワードを電子メールで送信してもらうことができます。カスタマーサービスの観点からは素晴らしいアイデアです。ユーザーはランダムなパスワードよりも最初のペットの名前を忘れる可能性は低くなりますが、セキュリティ上はひどいものです。秘密の質問への答えは、適切なパスワードよりもはるかに簡単に推測でき、情報ははるかに公開されています。

于 2012-07-23T19:09:16.750 に答える
19

私は行きます:

  1. ユーザーに電子メールを要求し、電子メールが登録されていることを確認します
  2. GUID を生成し、そのメールに送信します
  3. まだパスワードをリセットしないでください
  4. ユーザーはリンクをクリックし、新しいパスを入力する必要があります
  5. ユーザーがサイトにアクセスし、新しいパスを入力した後にリセット ボタンをクリックした後にのみ、パスワードをリセットします。
  6. その GUID を短期間で期限切れにできるようにして、安全性を高めます。
于 2010-09-05T00:30:28.170 に答える
12

電子メールで情報を送信する場合、安全ではありません。誰かがそれを手に入れる方法が多すぎます。あなたの情報を盗もうとする熟練したハッカーにとって、それは子供の遊びです。

パスワードや収入情報などの個人情報を電子メールで送信しないでください。情報が漏洩したり盗まれたりすると、あなたとあなたの組織にとって非常に恥ずかしいものになる可能性があります。セキュリティについて真剣に考えてください。すべてのレンガが落ちるには、その1つの事件が必要です。

パスワードの取得については、 Forgot Password Best Practicesをよくお読みください

肝心なのは、ベスト プラクティスに従うアプリケーションでは、ユーザーが自分のパスワードをリセットできるようにする必要があるということです。個人的な秘密の質問を使用する必要があります。アプリケーションは、電子メールを送信したり、パスワードを表示したり、一時的なパスワードを設定したりしないでください。

編集:更新されたリンク

于 2009-07-09T13:12:08.840 に答える
8

前述のように、必要なセキュリティのレベルによって異なりますが、より高いレベルが必要な場合は、私が見たいくつかの新しいソリューションが含まれます。

  • ユーザーの ID (セキュリティの質問、電子メール アドレスなど) が確認されたときに一時パスワードの半分を表示し、残りの半分を電子メール アカウントに送信します。メール アカウントが侵害された場合、同じ人物が中間者攻撃を実行した可能性は低いです。(英国政府ゲートウェイで見られる)

  • 電子メールやその他の媒体による身元の確認 - たとえば、登録済みの携帯電話にテキストで送信されたコード。(eBay / PayPal で見られます)

DaveG が述べたように、これら 2 つの両極端の間のどこかで、セキュリティの質問を実装することが進むべき道かもしれません。

于 2009-07-09T10:36:06.003 に答える
7

登録に電子メールアドレスを含める場合。「パスワードを忘れた」ボタンをクリックすると、そのメールアドレスにメールが送信されます。情報が信頼できる電子メールに送信されるようにします。

(データベースがハッキングされた場合を除きますが、安全なものは何もありません)。

于 2009-07-09T09:30:08.027 に答える
5

アカウント全体で一意のメールアドレスを適用します。

次に、パスワードを変更できる一時的なページへのリンクを送信するだけです。(24時間以内に許可してください)

このシナリオでは、ユーザーの電子メールアカウントが最も弱いリンクです。

于 2009-07-09T13:19:21.700 に答える
5

パスワードのリセットに関する情報を提供する3つの非常に優れたリンクを次に示します。

  1. http://jtauber.com/blog/2006/03/20/account_management_patterns/

  2. (ユーザーにGETを使用して確認させないでください):http ://www.artima.com/forums/flat.jsp?forum = 106&thread = 152805&start = 15&msRange = 15

  3. http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf

お役に立てば幸いです。彼らは確かに私が問題を理解するのを助けました。

于 2011-09-09T14:34:24.827 に答える