私はもともとここに返信としてこれを投稿しました このスレッドで ですが、フィードバックはあまりありませんでした。 2つのアプローチの間。
元のポイントは、ユーザーがWebサイトにパスワードを忘れたときにパスワードリセットリンクを送信する方が安全か、暗号化されていない元のパスワードを電子メールで送信するかということでした。
データベースが最終的にWebサイトから盗まれると、攻撃者はすべてのパスワードを1日でクリアすることができるため、パスワードをソルト化および暗号化しないことは悪いことです。わかった、わかった。
しかし、データベースが盗まれる可能性を無視し、ユーザーが自分のパスワードを忘れて「パスワードを忘れた場合の手順」を実行することだけを見ている場合、電子メールのプレーンテキストパスワードを介してリセットリンクを送信する方が安全か、それとも安全ですか。
私も同じだと思います。攻撃者が何らかの方法であなたの電子メールにアクセスできる場合(彼はあなたの電子メールのログイン詳細を知っているか、どこかでトラフィックを覗き見しているため)、したがって、限られた時間であっても、送信されたプレーンテキストパスワードまたはリセットリンクにアクセスできます。リンク。
攻撃者は、あなたが電子メールを持っていることに気付く前にパスワードをリセットする可能性があります。
ここでの私の考えには欠陥がありますか?
着信ストリームにアクセスするよりも、既存の電子メールのコーパスにアクセスする方がはるかに簡単です。たとえば、誰かのシステムに数分アクセスすると、メールを簡単に検索できます。したがって、攻撃者が古いメールにアクセスできても、新しい受信メールのストリームにはアクセスできない場合:
ユーザーがパスワードを受け取った後にユーザーがパスワードを変更する(おそらく、ユーザーがパスワードを教えてくれた場合はそうではない)か、リマインダーを削除する(永久にアーカイブまたは「ゴミ箱」フォルダーに移動しない)のいずれかです。メッセージ。
これが発生しない場合は、しばらくしてからユーザーのメールアカウントにアクセスできれば、(制限された時間/制限された使用、おそらく攻撃者が簡単に使用できないように制限された)リセットリンクはありません私には使いますが、(おそらくまだ有効な)パスワードを持っていることは確かです。
さらに、プレーンテキストのパスワードを私に送信することにより、これがアクセス可能な場所に保存されていることを示しています。ほとんどの場合、これは必要ありません。パスワード(およびソルト/ペッパー)を暗号化する必要がないため、ハッシュするだけで済みます。暗号化されている場合、データベースと復号化キーにアクセスできるすべてのユーザー(たとえば、ほとんどのスタッフ、またはデータベースと共にコードを盗むすべてのユーザー)がプレーンテキストのパスワードを取得できます。ハッシュ化されている場合は、ハッシュ化が行われる前に(たとえば、ログインセッション中に)取得する必要があります。
さらに、人々はそうすべきではありませんが、複数のサイトで同じパスワード(または非常に類似したパスワード)を使用することは非常に一般的です。つまり、1つのアカウントのみにアクセスする方法を提供するのではなく、多くのアカウントにアクセスする方法を提供することになります。
他のケースでは、攻撃者がすべての受信メールにアクセスできる場合(ユーザーに表示される前に受信メールを削除する可能性さえあります)、どちらも安全ではありません。電子メールアカウントは high-risk です。これは、そのようなアクセス権がある場合、ユーザーがアカウントを持っているすべてのサイトにアクセスして、パスワードのリセットを生成できるためです。これを回避するには、2要素認証など、電子メールアカウント以外(またはそれと同様)を使用してアクセスする必要があります。
後者の場合でもリセットリンクの方が優れていることに注意してください。攻撃者がリセットリンクを介してユーザーのパスワードを変更した場合、ユーザーがログインしようとすると、何かが間違っていることがわかります(遅すぎますが、少なくとも彼らは知っている)。パスワードを入力するだけの場合、ユーザーは攻撃者が静かにアクセスしたことを知りません。
パスワードがプレーンテキストで保存されているという事実を無視して、次の質問に飛び込んでみましょう。パスワードは有効期間が長いクレデンシャルですが、パスワードリセットリンクのスコープはさまざまです。
また、人々はあらゆる種類のサービスでパスワードを再利用するため、yourサイトでは無効になる可能性のある古いパスワードは、依然として顧客にとって非常に機密性が高い可能性があります。
その点で、人々のメールボックスにパスワードを入れることは、一種の失礼と考えることができます。
ユーザーのパスワードを平文で送信する場合、他のサイトでも使用するパスワードを送信している可能性があることに加えて、次回ログイン時にユーザーにサイトのパスワードの変更を強制したとしても、ユーザーに不利益をもたらすことはありません。まったく。
ユーザーに対する懸念が最も少ない場合に、パスワードをプレーンテキストで保存することは倫理的ではありません。安全なソルトハッシュを保存する必要があります。プレーンテキストのパスワードを送信すると、セキュリティを意識するユーザーがサービスを使用できなくなる場合があります(セキュリティを意識するユーザーはパスワードを再利用せず、露骨にセキュリティを意識しないサービスをサポートしたくないだけです)。
パスワードリセットの実装方法について。通常、中程度に安全なサイト(クレジットカードなど)では、基本的なセキュリティの質問(母親の旧姓など)に回答し、2要素認証の形式として、メールアカウントまたは電話番号を制御できることを確認する必要があります。リンクは短い時間枠(数時間から数日)でのみ有効で、1回のみ有効である必要があります(たとえば、ランダムに作成されたトークンが含まれており、最初の使用後に一定期間が経過すると期限切れになります)。
また、パスワードがリセットされたことを通知します(電子メールが侵害された場合でも、古いパスワードでログインできなくなると、攻撃者の証拠が見つかります)。パスワードを(変更せずに)送信すると、ユーザーが知らないうちに(メールが削除されたと言った場合など)この攻撃が密かに行われる可能性があります。
パスワードのリセットリンクを送信することをお勧めします。
一部のサイトでは、パスワードを忘れた場合のフォームを使用して、パスワードをすぐにランダムな値にリセットし、それをユーザーにメールで送信します。これにはサービス拒否の欠陥があります-アカウント所有者ではない誰かが自分のパスワードをリセットさせる可能性があります。パスワードがリセットされるのは、ユーザーがリンクをクリックしたときにのみパスワードがリセットされるためです。これを行うには、ユーザーがメールアドレスにアクセスできる必要があります。
ユーザーの電子メールにアクセスできる攻撃者に対するセキュリティを少し必要とする場合、通常のアプローチはセキュリティの質問も持つことです。これらは「あなたのペットの名は何でしたか」のような質問です。これらを尋ねるのは、ユーザーが電子メールのパスワードのリセットリンクをクリックした後です。
ここでいくつかの良いアドバイス: https://www.owasp.org/index.php/Forgot_Password_Cheat_Sheet
リセットリンクを送信することをお勧めします。
@Tony Meyerおよび@mhswendeによって与えられた理由に加えて、リセットリンクのページでは追加の認証が必要になる場合があります。多くのサイトでは、この目的のためにユーザーが「セキュリティの質問」に答える必要があります(以前のコンピューター標準では、母親の旧姓を求めていました)。電話番号のあるサイトでは、パスワードのリセットページで、SMSから送信されたコードを入力する必要がある場合があります。金融機関は、古い金融記録(過去のモルガジなど)について質問する場合があります。
良い二次認証メカニズムを考え出すのは簡単ではありませんが、パスワードのリセット(または回復)の手順が脆弱でないと、私はそれを過失と呼ぶほど脆弱になります。