「パスワードを忘れた」実装の最良の方法は?[閉まっている]


154

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

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

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

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

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


これはJSFの枠を超えているので、投稿にタグを付け直しました-そうすれば、より多くの応答が得られるでしょう。
マクダウェル

6
@Whoeverメタで「XYZのでこの閉じた質問を削除しましょう」という波がメタにあります。ソリューションに欠陥があり、その存在がセキュリティのケースに役立つ以上に文字通り害を及ぼすことが証明されない限り、この特定の質問は削除しないでください。
フェリックス・ガニオン-グルニエ

1
:パスワードを忘れた場合の回復戦略のOWASP「カンニングペーパー」owasp.org/index.php/...
daiscog

@megaflopによって提案されたリンクは悲しいことに壊れています。新しいリンクは次のとおり
Marco

回答:


187

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

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

1
これを実装する最も適切な方法は-一時的なパスワードリセットトークンをプレーンテキストのメールとしてユーザーに送信します(ただし、DBにプレーンテキストとして保存しないでください)-ユーザーがこのtempを入力した後、すぐに強制的に新しいパスワードを再入力してください。-偏執狂の場合は、smtpサーバーにsslがあることを確認してください。機密情報を含むメールが盗まれないようにしてください。ほとんどの場合、このアプローチはかなり安全です。S:あなたの場合は、さらにセキュリティを必要とする場合、あなたはおそらく自分のパスワードを忘れてしまったユーザーが持つべきではない
KaushikによるGopalの

6
ランダムな文字列/ GUIDを生成し、それをハッシュして使用するのはなぜですか?GUIDは十分ではありませんか?
Jeroen K

15
@jeroenk-だれかがDBを盗んだ場合、「パスワードのリセット」リンクを偽造して誰かのパスワードを変更することはできません。
Vilx- 2013

4
これは基本的に、パスワードを適切にリセットするための説明された方法です。crackstation.net/hashing
security.htm#

1
@David-ああ、私は投稿を編集したかったのですが、トピックはロックされています。:( OK、のは、もう一度試してみましょう:あなたのテーブルには列が含まれます:IDUserIDTimeTokenHashあなたは長いTWO、ランダムな文字列を生成しますで最初の文字列(「ID」)を入れてください。。IDカラム;ハッシュ秒(「トークン」 )とハッシュをTokenHash列に入れます。のようにリンクを生成します。リンクforogotPassword.jsp?id=asdasd&token=asdasdのトークンはハッシュされません。これは今意味がありますか?
Vilx-

28

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

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

  2. 必要に応じて、この段階で、事前定義されたセキュリティの質問への回答や生年月日などの追加情報を要求することにより、リクエストを確認できます。この追加レベルにより、ユーザーがリクエストしていないメールを受信できなくなります。

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

  4. ユーザーは、メールに記載されている一時的なパスワードとユーザーの識別子を含むリンクをクリックするか、「パスワードを忘れた」ページに移動して、一時的なパスワードとその識別子をコピーして貼り付けます。ユーザーは新しいパスワードを入力して確認します。

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

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

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

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


24

Troy Huntは彼の記事「安全なパスワードリセット機能の構築について知りたかったすべて」でいくつかの優れた点を述べています。最も関連する抜粋は次のとおりです。

[T] 2つの一般的なアプローチは次のとおりです。

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

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

...

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

リセットURLとは、リセットプロセスのこの特定のインスタンスに固有のWebサイトアドレスのことです。

...

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

...

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

...

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

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

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


1
そのリンクには明確なNSFW画像があり、これを変更するリンクがありますが、多くの人が最初にページをスキャンします。ばかげた考え!
nik0lai 2014

Troy Huntの記事へのリンクが変更されました。後藤troyhunt.com/everything-you-ever-wanted-to-know
knarfancho

@knarfancho修正、ありがとう!
Dave Liepmann、2017

15

私は一緒に行きます:

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

私は尋ねるのに困りたくありませんか?しかし、それはあなたの答えに関連しています。どのようにGUIDを生成していますか?
KingAndrew

2
-1は、ユーザーに送信するリンクにある種のハッシュを実装しない場合
TruthOf42

11

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

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

パスワードの取得については、「パスワードを忘れた場合のベストプラクティス」をよくお読みください

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

編集:リンクを更新



パスワードを忘れた場合のベストプラクティスのリンクを試しましたが、500サーバーエラーが発生しました。サーバーが今ダウンしていると思いますか、それとも他のリンクをたどっていますか?
KingAndrew

ここに行きます 。.fishnetsecurity.com
Resource_

リンクは再び死んでいます。
Eric Cope

ここでも、fishnetsecurity.com
6labs

7

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

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

  • 電子メールおよび別の媒体を介して身元を確認する-たとえば、登録済みの携帯電話にテキストで送信されるコード。(eBay / PayPalに表示されます)

DaveGによって言及されているように、これらの2つの極端な中間点のどこかで、セキュリティの質問を実装するのが良い方法かもしれません。


6

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

(データベースがハッキングされない限り、安全なものはありません)。


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

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


4

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

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

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


2

ユーザーにパスワードを電子メールで送信しないでください。自動生成されても。最善のアプローチ(SANSなどで推奨され、使用されています):

  1. パスワードを忘れた場合のページで、メール/ユーザーIDとユーザーからの新しいパスワードを尋ねます。
  2. 有効化リンクを使用して、そのアカウントに保存されているメールへのリンクをメールで送信します。
  3. ユーザーがそのリンクをクリックしたら、新しいパスワードを有効にします。

24時間以内にリンクをクリックしない場合は、リンクを無効にします(パスワードが変更されないようにします)。

ユーザーの同意なしにパスワードを変更しないでください。それは、誰かがパスワードを忘れたリンクをクリックしてアカウント名を見つけたからといって、新しいパスワードを電子メールで送信しないことを意味します。


13
私はこの手法に関心があります。攻撃者はあなたの電子メールと新しいパスワードを入力します。アカウントの所有者はメールを受信し、何かを読み誤り、リンクをクリックします。攻撃者が待機し、毎分新しいパスワードを試し、アカウント所有者が何が起こったのかを理解し、最終的に「パスワードを忘れた」ページに移動するまで、アカウントにアクセスします。
-Xceed

別の問題!パスワードのリセット時に新しいパスワードを提供することは、良い方法ではありません。数時間後にメールをチェックすると、新しいパスワードをもう一度忘れる可能性があります。
Yazid Erman、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.