web-dev-qa-db-ja.com

「パスワードを忘れた」最良の方法は何ですか?

重複の可能性:
パスワードを忘れた場合:パスワードを忘れた場合の機能を実装する最良の方法は何ですか?

私はコミュニティのウェブサイトをプログラミングしています。

「パスワードを忘れた」機能を構築したい。

さまざまなサイトを見てみると、それらはつのオプションのいずれかを採用していることがわかりました。

  1. ユーザーに一意の非表示のURLへのリンクを記載したメールを送信します。これにより、ユーザーはパスワードを変更できます(GmailおよびAmazon)

  2. ランダムに生成された新しいパスワード(Wordpress)を記載したメールをユーザーに送信する

  3. ユーザーに送信現在のパスワード(www.teach12.com)

オプション#はユーザーにとって最も便利なようですが、パスワードをMD5ハッシュとして保存しているため、オプション#3がどのように使用できるかわかりません。MD5は元に戻せません。これもinsecureオプションのようです。これは、Webサイトがパスワードをクリアテキストでどこかに保存する必要があり、少なくともクリアテキストパスワードが安全でない電子メールでユーザーに送信されていることを意味するためです。 。それとも私はここで何かが足りないのですか?

したがって、オプション#1を実行できない場合、オプション#2プログラムが最も簡単のようです。ユーザーのパスワードを変更して送信するだけだからです。これはやや安全ではないですが、安全でない電子メールを介して通信されるライブパスワードが必要なためです。ただし、これはトラブルメーカーによって誤用される可能性もありますpester usersランダムな電子メールを入力し、さまざまなユーザーのパスワードを絶えず変更することによって。

オプション#1最も安全のようですが、期限切れなどの隠しURLを処理するために少し余分なプログラミングが必要ですが、大規模なサイトが使用しているようです。

これらのさまざまなオプションを使用/プログラミングした経験はありますか?見逃したオプションはありますか?

54
Edward Tanguay

4)銀行口座に2つのランダムな金額を入金し、それらを入力するように依頼します。
5)カタツムリは彼らに新しいパスワードを郵送し、それを入力するように頼みます。
6)テキストメッセージを送信するか、電話をかけて、登録した携帯電話の電話番号に値を入力してもらいます。
7)Stack Overflow、Facebook、ブログエンジンなどのOpenIDプロバイダーにアウトソーシングすることで、パスワード管理の問題を完全に回避します。

それ以外では、オプション#1または#2を使用し、両方とも1時間で期限切れになる機能を追加します。

34
Jeff Moser

#1と#2を同等と説明している回答に対する賛成票にショックを受けました。彼らはまったくそうではありません。パスワードを変更するための短期間のリンクをユーザーに送信することは、帯域外のやり取り(メール、テキストメッセージなど)を伴わない、最も便利で、最も一般的に使用され、最も安全なアプローチです。いくつかの理由:

  1. パスワードを忘れた場合のリンクを介して一時パスワードを設定すると、ユーザーはユーザーのパスワードを効果的に変更し、ユーザーのログインを知っている場合はユーザーをアカウントからロックアウトできます。リンクを使用すると、ユーザーは誰かがいじり回していることを知っているだけで、アクセスに影響はありません。
  2. パスワードリセットリンクは短期間しか有効ではないため、攻撃者が攻撃するための非常に小さなウィンドウがあります。また、攻撃者がリンクを傍受し、それを使用してパスワードを変更すると、リセットリンクが機能しなくなるため、ユーザーはそれを知っているはずです。新しく割り当てられたパスワードがユーザーによってすぐに変更されない場合、パスワードを傍受した攻撃者は、ユーザーを無期限に静かに偽装する可能性があります。したがって、大きな違いは、ハッカーはパスワードのリセットリンクの電子メールを傍受できますが、リンクを使用してユーザーのパスワードを変更すると、ユーザーは何かが間違っていることを認識しますリンクが機能せず、別のパスワードリセット要求が生成されるためです。
  3. 使いやすさ-ユーザーは、生成した新しいランダムパスワードを入力するのではなく、電子メール内のリンクをクリックするだけです。

また、セキュリティの質問は、サイトの安全性を低下させることがよくありますが、それ以上ではありません。これらは別の攻撃ベクトルであり、多くの場合、最も弱いリンクです。このトピックに関する優れた議論については、 Webアプリケーションハッカーのハンドブック を読むことを強くお勧めします。

9
Cory House

オプション#2では、古いパスワードを追跡し、たとえば24時間以内に使用されない場合は、新しいランダムパスワードを期限切れにする必要があることに注意してください。

そうしないと、新しいランダムパスワードを繰り返し発行して迷惑をかける可能性があります。メールの近くにいない場合は、通常のパスワードでログインできない理由がわからない可能性があります。

また、「識別の質問」を要求することを回避してください。これらの質問への回答は、通常、実際のパスワードよりも推測/検索がはるかに簡単です。そのため、誰もが自分自身を私として識別できます。これがいかに安全でないかの最近の例については、 サラペイリン の話を参照してください。

8
Martin Geisler

オプション1と2は互いに安全ではありません。

そこ。私はそれを言いました。ユーザーの電子メールアカウントが侵害された場合、住所や母親の旧姓などの個人データをさらに収集しない限り、安全な方法はありません。これらはすべて推測できます。

私が見た中で最高の(最も厄介な)バージョンは、秘密の質問を覚えておく必要がある場所ですそして秘密の答え。これは、ユーザーがどの質問をしたかを覚えておく必要があることを意味します。もちろん、これも常に忘れることができます。

彼らが質問を忘れて、あなたが「本物の」会社である場合、すべてのセキュリティをリセットする方法の説明とともに、投稿を通じてユーザーにトークンを送信するオプションが常にあります...ハッカーがアクセスできる可能性はほとんどありません彼らの実際のメールに。

その偏りは、ユーザーがアカウントを作成したときに電話番号を収集することです。それが存在し、彼らが詳細を思い出せない場合は、詳細をリセットする方法を指示するある種の自動通話システムを設定できます。

そして、#2について言及する1つのこと:プロセスに現在のアカウントのパスワードを上書きさせないでください。それが起こった場合、誰かがアカウントのパスワードを忘れたと言う可能性があり、多くの不要なパスワード変更を引き起こします。

6
Oli

オプション1と2のセキュリティに実際の違いはありません。オプション1は、フォームに新しいパスワードをプリロードすることと実質的に同じです。

実際、フィッシング攻撃が蔓延しているため、長いURLでオプション1の使用を奨励すると、長い不思議なURLをクリックすることについて人々が注意を怠る可能性があると主張することができます。

4
Cade Roux

あなたの質問に特に関係のないことについての簡単なメモ。 MD5を使用して保存されたパスワードをハッシュするとおっしゃいました。オプション1または2のどちらを使用するかに関わらず(明らかな理由から、3は最も安全性が低くなります)、MD5はクラックされたハッシュアルゴリズムであり、ハッカーがによって保護されているアカウントにアクセスするのをかなり簡単にすることができます。 MD5ハッシュ。

脆弱性の詳細については、次のURLを参照してください:en.wikipedia.org/wiki/MD5

より良いハッシュソリューションは、SHAのようなものです。これは、依然として安定した安全なハッシュアルゴリズムです。オプション#1または#2と組み合わせると、ユーザーのパスワードを保護するために適度に安全なシステムを導入し、最も断固としたハッカーを除くすべてのハッカーを排除する必要があります。

4
jrista

OWASPトップ1 を読んで、メソッドが準拠していることを確認してください。

ここ は直接リンクです。

4
karim79

オプション#1には、#2に比べていくつかの大きな利点があります。ランダムなユーザーが私のメールアドレスを「パスワードを忘れました」ボックスに入力した場合、パスワードはリセットされません。また、Gmailの受信トレイに永久に保存されているサイトのパスワードの永続的な記録がないという点で、少し安全です。

ここで重要な欠落している部分は、#1で提供するリンク1回のパスワードリセットでのみ機能し、時間制限があるはずです

これらすべてのソリューションは、電子メールの受信トレイをそれらすべてを支配する「一つの指輪」として扱っていることを意味します。とにかく、ほとんどのオンラインサービスは今日これを行っているようです。

私の好ましいアプローチは、可能な限りopenidを使用することです。パスワード管理は地獄であり、誰も正しく理解していないようです。この問題を他の人に渡す方が簡単です。

2
Sam Saffron

オプション#1がおそらく最良です。 #3は安全ではありません(SHA1など、MD5よりも強力なものを使用することもお勧めします)。オプション#2は、セキュリティ保護用の質問を使用しない限り、メールをチェックするまで、ランダムな人があなたをアカウントから締め出すことができるため、適切ではありません。また、セキュリティの質問は、パスワードよりも簡単に解読できることがよくあります。

2
Zifre

オプション#3が安全でないというあなたのコメントに同意します。

#1または#2のいずれかのプログラミングに関しては、オプション#2の方がプログラミングが簡単ですが、#1はそれほど難しくなく、どちらもおそらく互いにほぼ同じくらい安全です。

どちらのオプションを選択した場合でも、パスワードを忘れた場合のプロセスの一部として(登録時に取得した)個人情報の要求を含めることで、より安全にすることを検討できます。

ユーザー名があり、新しいパスワードを取得するには、ユーザー名とメールアドレスの両方を入力する必要があるシステムをプログラムしました。ユーザー名のリマインダーを送信することはできますが、重要な点は、誰かがユーザー名と電子メールを推測できない可能性があるということですが、電子メールだけでそれを行うと、安全性が低下します。

秘密の質問は、個人情報の部分へのアプローチです。個人的には、多くの人が答えを知っている、推測できる、または見つけることができる質問を選択する傾向があるため、それらはあまり価値がないと思います。ただし、すでに比較的安全な方法と組み合わせて使用​​する限り、何もないよりはましです。

明らかに、これを実行すればするほど、プログラミング作業も増えます。

最も簡単な方法は次のとおりです。

  1. 「ユーザー名を思い出してください」リンクがあります(メールアドレスを入力してください)。メールが送信されたかどうかをユーザーに知らせないでください。ユーザーはメールアドレスを使用して、メールアドレスがメンバーのものであるかどうかを確認できます。常に受信トレイでリマインダーメールを確認するようにユーザーに伝えますが、誰かがメンバーである場合にのみ送信してください。そして
  2. 新しいワンタイムパスワードを送信するには、ユーザー名と電子メールの両方が必要です。そのパスワードは1時間かそこらしか持続しないはずです。ユーザーがそれを使用するとき、彼らはすぐに彼らのパスワードを変更することを強制されるべきです。
1
cletus

オプション4:アカウント名とメールアドレスを入力してパスワードをリセットするようユーザーに要求します。サイトで本名や電子メールアドレスを開示していない限り(なぜこの時代にあなたはそうするのですか?)、これは適度に安全で改ざん防止の方法です。パスワード自体ではなく、リセットページへのリンクを送信します。

オプション5: OpenID を使用し、それについて心配する責任をサードパーティに渡します。

正直なところ、これはほとんどのサイトが必要とするよりもはるかに多くの努力です。私は、平文のパスワードを受信トレイの「登録」フォルダに保存しているため、電子メールで平文のパスワードを受信するのが好きです。そうすれば、サイトのパスワードを忘れたときに検索できます(これは頻繁に発生します!)。誰かが私のメールを読んでいる場合、私は自分のTwitterアカウントを使用している人よりも大きな問題を心配しています(私が持っていた場合)。もちろん、銀行や企業にはより強い要件がありますが、サイトが何であるかを指定していません。それがベストアンサーの鍵です。

1
SpliFF

オプション1または2のいずれかで問題ありません。あなたが言ったように、あなたがクリアテキストのパスワードを保存する必要があるので、オプション3は安全ではありません。おそらく、気が利いて、可逆暗号化アルゴリズムを使用してパスワードを保存/取得することができますが、より良い代替手段が利用できるので、その道を進む理由はありません。

0
Justin Ethier

あなたが言及するオプションのいずれかと組み合わせて使用​​できる追加のオプションがあります:

ユーザーにパスワードのリマインダーを書かせて、パスワードを忘れたときの最初のステップとしてユーザーに送信することができます。リマインダーがユーザーの役に立たない場合は、次のオプションに進むことができます。

リマインダーはパスワードそのものではないので、メールで送信しても安全です(またはページに直接表示することもできます)。

0
Guffa

それらをハッシュしている場合、オプション3は使用できず、ハッシュしていない場合は、恥ずべきことです。 :)

私はオプション1を好みます。パスワードのリセットリンクをメールに送信して、(期間限定で)パスワードをリセットできるようにします。それはより多くの作業を必要としますが、彼らにとっては使いやすく、最終的には電子メールのログインプロセスと同じくらい安全です。

0
Anthony Potts

両方の利点を活用して、#1と#2を組み合わせることができます。

ランダムに生成された新しいパスワードを変更できるようにする、一意の非表示のURLへのリンクを記載したメールをユーザーに送信します。

そのページはSSLである可能性があり、パスワードは12〜24時間で期限切れになる可能性があります。

0
eKek0

ユーザーに個人的にオフィスに来て、IDカードまたはパスポートで身元を証明するように指示します。

もちろん、これは、ユーザーの近くにオフィスがあり、アカウントがこの手順を正当化するのに十分な価値があることを前提としています。たとえば銀行に適しています。

0
Juha Syrjälä

私は本当に満足していないいくつかの方法を試しました。次のプロジェクトのために私が決めたのは、次のことです。

  1. ユーザーがユーザー名とメールアドレスを入力します
  2. 48時間の有効期限でdbに保存されたurlとguidパラメータを含むリンクで送信された電子メール
  3. ユーザーがパスワードをリセットすることを確認します
  4. 新しいパスワードがユーザーに電子メールで送信されます
  5. 新しいパスワードでログインすると、メッセージが表示されるか、パスワードの変更ページにリダイレクトされます。
0
Duncan