14

ユーザーがパスワードをリセットできるようにするモジュールを実行しています。ほとんどのWebサイトが、一意のハッシュを持つクエリ文字列を含む確認リンクを提供していることに気付きました。

私の質問は、同じユーザーがパスワードを忘れるたびにこの一意のハッシュを生成するにはどうすればよいですか?このハッシュをデータベースに保存し、後で検証するために使用する必要がありますか?安全ですか?または、ワンタイムパスワードを生成するある種のアルゴリズムを作成する必要がありますか?どうすればOTPを生成できますか?

4

4 に答える 4

30

はい、すべきです

  1. ランダム リセット トークンを生成します。たとえば、この回答を参照してください。
  2. データベースに保存します(おそらく有効期限付き)
  3. リセット トークンを含む電子メールをユーザーに送信します。
  4. ユーザーは、クエリ文字列にリセット トークンを含むパスワードのリセット ページにアクセスします。
  5. データベースをチェックして、リセット トークンに関連付けられているユーザーを確認し、有効期限が過ぎていないかどうかを確認します。
  6. すべてがチェックアウトされたら、ユーザーがパスワードをリセットし、データベースからリセット トークンを削除できるようにします。

リセット トークン (またはそれを何と呼びたいか) の生成については、多くの混乱があるようです。私がリンクした回答を読んで、ハッシュと弱いシードで車輪を再発明しないでください。

于 2010-08-24T15:50:32.817 に答える
3

ユーザーのID、ユーザーのソルト(ユーザーのパスワードをソルトしますよね?)、および疑似ランダムデータでハッシュ関数を使用するだけで問題ありません。

$pwd_reset_hash = hash ( 'sha256' , $user_id . $user_salt, uniqid("",true));

このユーザーのリセットキーとして(リクエストの時間とともに)DBに保存します

 user_id  pwd_reset_hash  time_requested  
===========================================  
 123      ae12a45232...   2010-08-24 18:05

ユーザーがそれを使用しようとするときは、ハッシュがユーザーと一致し、時刻が最近のものであることを確認します (たとえば、「リセット コードは 3 時間有効です」など)。

使用または期限切れになったらDBから削除する

于 2010-08-24T15:51:32.240 に答える
1

進むべき道は、確かにある種のランダムなものを生成し、それをデータベースに保存することです。パスワードが変更されるとすぐに、関連するレコードをテーブルから削除して、リンクを再度使用できないようにします。

  • 「トークン」を含む URL をユーザーにメールで送信します。
  • リンクにアクセスした場合は、トークンが存在するかどうかを確認し、ユーザーがパスワードを変更できるようにします
  • データベースからトークンを削除します。

他の応答で既に述べたように、ユーザー ID の SHA1 または MD5 を実行し、マイクロタイムといくつかのソルト文字列を組み合わせることは、通常安全な方法です。

于 2010-08-24T15:53:09.750 に答える
0

1) 一意のハッシュを生成するには、現在の時刻、ユーザー ID、およびいくつかのソルト (テキスト) を混ぜます。たとえば、Web サイトが mysite.com の場合、次のコードを使用します。

 $hash = md5(time() . $userid . 'mysite');

これにより、適切なハッシュが作成されます。

2) はい、データベースに保存します。
3) はい、一定期間後にハッシュを期限切れにする限り、安全です。
4) いいえ、通常、ワンタイム パスワードの生成はユーザーを悩ませます。

于 2010-08-24T15:50:46.870 に答える