web-dev-qa-db-ja.com

パスワード回復のベストプラクティスを実装する

Webアプリケーションにパスワード回復を実装したい。

秘密の質問の使用は避けたいです。

パスワードを電子メールで送信することもできますが、リスクがあると思います。

新しい一時的なランダムパスワードを生成して電子メールで送信することもできますが、上記の点と同じくらい危険だと思います。

たとえば、URLを電子メールで送信できますか http://example.com/token=xxxx ここで、xxxxはユーザーに関連付けられたランダムトークンです。そのため、ユーザーがそのURLに移動すると、パスワードをリセットできます。

61
Enrique

まず、notユーザーのパスワードの平文コピー、または暗号化されたバージョンを保存します。ユーザーのパスワードのhashedコピーのみを保持する必要があります。

回復ソリューションに関しては、ユーザーのパスワードを変更するための回復リンクが、私の経験では最良のソリューションであることがわかりました。セキュリティの観点からは、次のログイン後に変更される新しいランダムなパスワードを送信することとほぼ同じですが、ユーザーにとってはおそらく少し便利でしょう。回復URLを妥当な短期間で失効させることと、1回だけ使用可能にすることをお勧めします。

48
Kitsune

空軍にいたときのセキュリティルールは次のとおりでした。パスワードを設定またはリセットするときは、同じメールでユーザーIDとパスワードを送信しないでください。そうすれば、誰かがパスワードを盗む電子メールを傍受している場合、セキュリティを侵害するために、両方の電子メールを正常に傍受し、それらを接続できる必要があります。

「このURLにアクセスしてパスワードをリセットする」を使用するサイトをたくさん見ました。多分私は何かを見逃している-私はセキュリティの専門家であると主張していない-しかし、それが新しい、一時的なパスワードを発明してそれを送信する以上に安全である方法を見ない。ハッカーがメールを傍受した場合、なぜそのリンクにアクセスして正規のユーザーと同じように新しいパスワードを見ることができないのでしょうか?セキュリティが向上せず、ユーザーにとって余分な手間がかかるように思えます。

ところで、セキュリティの質問を使用していないことをおめでとうございます。このデバイスのロジックは私を免れさせます。コンピューターセキュリティの夜明け以来、「ハッカーが高校の名前や好きな色のような、ハッカーが発見したり推測したりすることのできる自分に関する情報であるパスワードを作成しないでください。ハッカーは高校の名前を調べたり、あなたのことを知らなかったり、あなたのことを何も知らない場合でも、学校に行った場所の近くにまだ住んでいる場合、地元の学校を試してみて、それを見つけます。ハッカーが推測できるような少数の好みの色。代わりに、パスワードは文字、数字、句読点の無意味な組み合わせである必要があります。」しかし今、私たちは彼らに、「しかし!あなたがその意味のない文字、数字、句読点の組み合わせを覚えるのに苦労しているなら、問題ない!あなたの高校の名前のような簡単に覚えられるあなた自身に関する情報を手に入れなさい、またはあなたの好きな色-そして、あなたは「セキュリティの質問」への答えとして、つまり、代替パスワードとしてそれを使用することができます。」

確かに、セキュリティの質問は、ハッカーにとって、最初に間違ったパスワードを選択した場合よりもさらに簡単になります。少なくともパスワードに個人情報を使用した場合、ハッカーはあなたがどの個人情報を使用したかを必ずしも知っているとは限りません。犬の名前を使いましたか?生年月日?好きなアイスクリームの味は?彼はそれらすべてを試さなければなりません。しかし、セキュリティの質問については、パスワードとして使用した個人情報をハッカーに正確に伝えます!

セキュリティの質問を使用する代わりに、「パスワードを忘れた場合、画面の下部に表示されます。他の人のアカウントにハッキングしようとしている場合は、絶対に禁止されています。下にスクロールします。」安全性はわずかに劣ります。

疑問に思うかもしれませんが、サイトが私が生まれた都市や私の最初の車のメーカーを尋ねるとき、私は彼に質問に対して実際の答えをしません。意味のないパスワードを指定します。

</ rant>

84
Jay

この問題に対するほとんどの解決策はセキュリティを弱めるので、あなたがすべきすることを言うのは難しいです。 SMSの送信、コールバック検証、ワンタイムパスワードジェネレーター、またはパスワード回復を別のメディアに行うその他のスキームを調査する場合を除きます。

ただし、あなたがすべきではない

  • パスワードを送信します-結局のところ、既に述べたように、あなたはそれを持っていないからです。

  • 新しい一時パスワードを生成します-これはパスワードを送信するのと同じくらい安全ではないだけでなく、サービス拒否攻撃の可能性にもつながります。私はサイトに行き、あなたのふりをして、新しいパスワードを要求します。(あなたのメールをチェックしていない場合)あなたはログインできず、理由がわからず、新しい新しいパスワードを要求する必要があります。 。

トークンはおそらく進むべき道です。それを受信すると、忘れられたパスワードリクエストが通知されますが、確認しない限りアクションは実行されません。また、リスクを制限するために、比較的短い有効期限を持つワンタイムトークンにすることもできます。

もちろん、多くはアプリケーションに依存します。明らかに、金融やその他の機密情報を保護することは、アカウントがmytwitteringfacetube.comでハッキングされるのを防ぐよりも重要です。とにかく情報。

20
Duncan

明らかに、元のパスワードを保存していないので、元のパスワードをメールで送信することはできません(そうですか?!)。一時パスワード(1回のログインでのみ機能するため、変更する必要があります)とパスワードをリセットするリンクの送信は、セキュリティの観点からは同等です。

10

私は秘密の質問方法に対する態度を理解していません。パスワードを「BlueHouse」にしてから、「あなたの2つのお気に入りは何ですか?」というセキュリティの質問をするつもりはありません。そして答えは「青と家」です。セキュリティの質問は、実際のパスワードを取得するための魔法の鍵ではありません。これは通常、ファイル上の電子メールアドレスに送信される新しいパスワードを取得する方法です。他にあなたがそれをどうやってやるのかわかりませんが、2つのうちの1つをしているように聞こえます。

1)ユーザーが「パスワードを忘れました」ボタンをクリックすると、新しいパスワードがユーザーに送信されます。

2)ユーザーは「パスワードを忘れました」ボタンをクリックし、新しいパスワードをファイルのアドレスにメールで送信する前に、セキュリティの質問に答える必要があります。

オプション番号2の方が安全だと思われます。

トークンの送信がパスワードの送信よりも安全なのはなぜですか?メールアカウントがハッキングされている場合、ハッキングされています。パスワード、トークン、または新しいパスワードをリセットするリンクがあるかどうかは関係ありません。忘れないでください、ほとんどのサイトは「新しいパスワードはあなたがハッキングするために次のメールアドレスに送信されました」と言っていないことを忘れないでください。ハッカーは、ハッキングする必要のあるメールアドレスを推測する必要があります。

5
Andy Casey

アンディに同意します。セキュリティの質問は通常、パスワードとは無関係ではありませんか? (私のもの)意味は質問と回答があり、パスワードとは関係ないということです。これは偽のパスワードリセットリクエストを防ぐために使用され、実際に使用されているようです。

想像してみてください-誰かがサイトの「パスワードを忘れた」ユーティリティにアクセスして無数の電子メールアドレスを入力することもできますし、迷惑をかけたい人を1人だけ入力することもできます。その時点でパスワードがリセットされた場合、それらの電子メールアドレスに属しているユーザーは、電子メールでパスワードのリセットを確認し、次にパスワードをリセットしてサイトにログインする必要があります。セキュリティの質問では、これは誰かにとって簡単なことではありません。

Amazonが指定されたメールへのリンクを送信しているようです。また、DOS攻撃を防ぐためにキャプチャを入力する必要があります。これはリンクであるため、パスワードをすぐにリセットせず、ユーザーがリンクをクリックするとリセットされることを意味すると思います。上記のシナリオでは、ユーザーは電子メールを見て、「いいえ、私はそれをしませんでした」とメモし、パスワードを不必要に変更する必要がないビジネスに取り掛かります。セキュリティ保護のための質問が、最初の試みを阻止し、正当なユーザーが最初にメールを取得できなかった可能性があります。

ホワイトペーパーは次のとおりです。 http://appsecnotes.blogspot.com/2010/09/latest-forgot-password-best-practices.html

これは実際に認証プロセスの主要な部分として秘密の質問を推奨しています。また、電子メールで認証コードを送信して要求することは、オプションで含めることができる単なるアドオンレイヤーです。

5
mikato

本当に必要なセキュリティにかかっています。極端な場合の1つは、パスワードのリセットプロセスです。あなたのメールボックスが同様に危険にさらされる可能性があるため、ID経由で。実際、人々はどこでも同じパスワードを使用する傾向があるため、これは非常に可能性が高いです。もう一方の端には、ランダムな新しいパスワードでメールを送信するだけの標準的なアプローチがあります。

「秘密」の質問と回答は、通常は信じられないほど簡単に推測できる致命的な欠陥を持つユーザー名とパスワードの別の形式であり、使用したくないので良いことです。

トークンについては、全体的なセキュリティに大きな違いはないと思います。ユーザーがパスワードを変更できるようにするトークンを送信するか、ランダムなパスワードをすぐに送信するかは大きな違いにはなりません。

トークンが1回だけ使用可能であり、できれば限られた時間内でのみ使用可能であることを確認してください。要求してから+24時間。

また、以前の回答で指摘したように、プレーンパスワードを決して保存しないでください。それらをハッシュします。 salt を追加してください。

4
ilikeorangutans

ここに私がそれを解決した方法があります:

_retrieve_token_および_retrieve_expiration_フィールドを「ユーザー」テーブルに追加しました。

ユーザーは、電子メールを提供してcaptchaに記入することにより、パスワードのリセットを要求します。ランダムなハッシュ値が_retrieve_token_フィールドに対して生成されます-すなわちmd5($user_id.time())、_retrieve_expiration_は次の45分で期限切れになる日時に設定されます。メールがリンクとともにユーザーに送信されます。

_https://example.com/reset-password?retrieve_token=912ec803b2ce49e4a541068d495ab570_

認証が必要な場合、SSLは必須です。電子メールとIPアドレスを保存するリセット要求を記録するためのテーブルを追加することもできます。起こりうるブルート攻撃を追跡するのに役立ち、必要に応じて攻撃者のIPをブロックできます。

パスワードのリセットを要求するためのセキュリティの質問を実装することもできますが、captchaは、要求を複数回繰り返すことを阻止するのに十分だと思います。

3
bazzaretta

@ジェイ。誰かに新しい一時パスワードを送信するのではなく、URLにアクセスしてパスワードをリセットする理由は、単なるセキュリティ以上のものです。トークンを含むURLのようなものがなければ、他の人のパスワードをリセットできます。メールにアクセスする必要はありません。誰かが誰かと一緒に選ぶ骨を持っている場合、彼らは新しいパスワードのリセットを開始し続けることができます。その後、貧弱なターゲットはログオンしてパスワードを何度も変更する必要があります。

トークンを送信することにより、ユーザーがログインして確認するまで、ユーザーのパスワードは変更されません。リセットされたメールのスパムは無視できます。トークンは、GUIDを使用して新しいパスワードと同じくらい簡単に(簡単ではないにしても)生成できますが、開発者にとってはそれほど面倒ではありません。

また、GUIDは一意であるため(生成されたパスワードは一意ではない可能性があります)、トークンをユーザー名に結び付けることができます。URLに間違ったユーザー名が指定された場合、 (つまり、別の人がそれを開始し、誰かがそれを傍受した場合..ユーザー名がメールと同じではないと仮定した場合)。

2
Devon

@ジェイ。セキュリティの質問を適切に使用するのは、実際にパスワードをリセットするためではなく、パスワードリセットメールを開始することです。セキュリティの質問などのメカニズムがなければ、パスワードのリセットを開始できます。一見良さそうに見えますが、リセットメールの送信は、元の所有者に属していない可能性のあるメールに送信される可能性があります。これは珍しいことではありません。たとえば、従業員が会社を退職すると、それらのメールは別の従業員に転送されることがよくあります。セキュリティの質問は、そのシナリオに難読化の低レベルを追加します。また、1人のユーザーが間違ったアカウントでパスワードのリセットを開始し続けることにより、一部の貧しいSODが意図せずにスパム送信されるという問題も軽減されます。セキュリティの質問は、本当に安全であるように意図されたものではなく、それらのようなシナリオを減らすためのものです。セキュリティの質問を使用して実際にパスワードをリセットする人は誰でも間違っています。

1
Devon

Node.jsを使用して、基本的にランダムトークンを生成し、有効期限を設定し、トークンを添付したリンクを送信し、reset/:tokenユーザーがそのトークン(有効期限も切れていない)を使用して存在することを確認し、存在する場合は、パスワードのリセットページにリダイレクトするルート。

http://sahatyalkabov.com/how-to-implement-password-reset-in-nodejs/

0
Leahcim

セキュリティの質問/回答について。ウェブサイトのユーザーとして、私は個人的にそれらを使用しません(私はそれらにゴミを入れます)。しかし、ここで言うように、彼らは確かに無用でも無意味でもありません。

この状況を考えてみましょう。サイトのユーザーが机を離れて昼食に出かけ、ワークステーションをロックしませんでした。悪意のあるユーザーは、パスワードの回復/リセットのページにアクセスして、ユーザーのユーザー名を入力できるようになりました。システムは、セキュリティの回答を求めることなく、回復/リセットしたパスワードを電子メールで送信します。

0
Magnus