web-dev-qa-db-ja.com

パスワード回復のための最新の推奨事項

認証にパスワード回復を実装します。私はこれをしばらくまとめておらず、知っておくべきことがあるかどうか疑問に思っています。

現時点での私の考えは:

  1. ユーザーが[パスワードを忘れた]をクリックして、パスワード回復ページに移動します。
  2. 彼らは自分の電子メールを入力し、リンクとパスワードの回復トークン/キー(MD5文字列-多少ランダムで長い必要がありますか?)とともにそのアドレスに電子メールが送信されます。エントリはpassword_recoveryデータベーステーブルにも作成され、そのトークンはアカウントに関連付けられており、有効期限(1時間?)
  3. 彼らは電子メールを取得し、リンクをクリックしてパスワードセットページに移動します。2つのフィールドにパスワードを入力し、パスワードを再度確認します。
  4. 完了しました。新しいパスワードでもう一度ログインしてください

いいですか?このアプローチが推奨されなくなった長年の間に何か変わったことはありますか?

更新

私が選択した追加:

  • ハッシュされたデータベースにトークンを保存します。ハッカーが何らかの形でデータベーステーブルにアクセスできるようになっている場合、格納されたトークンを使用することはできません..うまくいけば(sha256でハッシュ化)
3
Martyn

いいですか?

はい。メールがサイトの主要な認証形式であると想定しています。

このアプローチが推奨されなくなった長年の間に何か変わったことはありますか?

私が知っていることではありません。

ここで、考慮すべき点をいくつか示します。

ユーザーに与えるフィードバックの種類

メールが存在しない場合、何を言って何をしますか?

  • 「申し訳ありませんが、このメールは存在しません」などのメッセージが表示された場合は、データベースに誰が存在するか、または存在しないかに関する情報が漏洩していることになります。
  • 代わりに、「このメールがユーザーアカウントに対応している場合は、さらに詳しい説明が表示されます」というメッセージを表示できます。これはより安全ですが、ユーザーを混乱させる可能性があります(「メールが届かないのはなぜですか」)。
  • 3番目のオプションは、always電子メールを送信することです。電子メールがデータベースになかった場合は、内容が異なるだけです。ただし、これによりフォームが不正使用される可能性があります。誰かが他のユーザーのメールを入力する可能性があり、最終的にはメールがスパム送信されるからです。

システムでユーザー名を使用している場合は、メールアドレスではなく、ユーザー名を尋ねた方がよい場合があります。アカウントに関連付けられたメールアドレスに回復用メールを送信しますはユーザーに開示しません。

虐待からプロセスをどのように保護しますか

  • 誰かがこのフォームを使用してメールを生成し、ソーシャルエンジニアリングを使用してユーザーにリンクをクリックするように(またはさらに悪い場合はメールを転送するように)誘導する方法を簡単に確認できます。したがって、メールでそれを非常に明確にする必要があります。
  • 何らかの方法でこのフォームをブルートフォースから保護する必要があります。いくつかの例:アカウントごとにアクティブなリクエストは1つだけ(前のリクエストが期限切れになるまでメールを再送信しないでください)、IPアドレスごとの試行回数の制限、スロットル、CAPTCHAなど。

トークン

トークンは、実際にはユーザーアカウントのワンタイムパスワードです。

  • トークンはrandomおよびunpredictableで、データベースに格納されている必要があります対応するユーザーIDへの関連付け、およびタイムスタンプ。 MD5は必要なく、トークン内の何かをエンコードする必要もありません。 PHPでの32文字のトークンの例:bin2hex(openssl_random_pseudo_bytes(16));
  • トークンの有効期間は短い必要があります。 1時間は少し長いようです。パスワードを忘れた場合は、回復したいと思いますなので、おそらく30分で十分ですが、正直なところ、これはあなた次第です。ポイントは、トークンの有効期間を制限することです。
  • トークンを使用したらすぐに無効にする必要があります
  • ユーザーごとにアクティブなトークンを同時に複数持つことはできません。リレーショナルデータベースの観点からは、usersテーブルではなく、個別のテーブル。
  • リセットトークンのハッシュの有用性についてはわかりません。データベースのリスクは、有効期間が短く、1回限りの使用ですでに軽減されています。それらは電子メール(安全でない)で送信されるため、実際のリスクはトランスポートにあります。しかし、なぜでしょうか。
6
rlanvin

私は確かに周りを見回して、最新かつ最高の暗号化アルゴリズムを見つけます。どれが最適に機能するかについては多くの議論がありますが、一般的に、最先端のアルゴリズムの中で、1つまたは別のアルゴリズム間の利点は無視できる程度であることがわかりました。そうは言っても、SHA256、SHA512、RipeMD、またはWHIRLPOOLなどのMD5の代替案を検討することは確かです。常に調査を行い、暗号化方式が低価格になっていないことを再確認することをお勧めします。

また、SALTを含む質問は見当たりませんでした。これは間違いなく、ハッカーが辞書攻撃やハッシュテーブルを使用して解読するのが簡単すぎるパスワードを実装する可能性があるユーザーに追加のセキュリティを提供するために実装を検討する可能性のあるものです。

最後にもう1つ(私はあなたがこれを検討したと仮定しています)。私が確かにForgot-my-Passwordシステムに入力する回復メールが実際にそのユーザーのファイルにあるメールと一致することを確認します。また、安全のためにセキュリティの質問を含めることもあります。

2
Christine

これが一般的なアプローチなのか、それともこのような問題に対する私の個人的な方法/アイデアなのかはわかりませんが、次のようにします。

クライアントのIPを取得し、任意のアルゴリズムで暗号化しますが、リンク内の結果をトークンとして取得し、タイムスタンプを挿入します。

この場合、リンクはクライアントのIPと特定の時間のみ有効です。

今、攻撃の真っ最中の人でさえ、リセットトークンをハイジャックすることができません。

ユーザーのMACアドレスを要求することもできますが、私の考えでは、これはほとんどやり過ぎです。

これは、最新のリセットトークンを保存するための私の個人的なアプローチです。

1
Yosh Synergi