ハッシュ コードを使用して、パスワード リセット URL の詳細を検証します。これはすべて、DB に何も書き込むことなく、または特権情報を攻撃者に送信することなく実行できます。
通常のパスワードのソルトとハッシュについて簡単に説明します。ソルトが1111
でパスワードがであるとpassword
すると、2 つを連結して文字列をハッシュし、1111password
これにより のハッシュが得られるとし9999
ます。次に、元のソルト1111
とハッシュ9999
をユーザー レコードに保存します。
パスワードを検証するときは、保存されたソルトを使用し、パスワード試行を連結してハッシュし、保存されたハッシュと比較します。たとえば、asecret
になり1111asecret
ますが、 にハッシュされ8888
ます。これは元のハッシュと一致しないため、パスワードの一致は失敗します。
もちろん、ソルトとハッシュは通常、確立された暗号ライブラリを使用して適切に生成および計算されます (自分で発明しないでください!)。
パスワード リセット URL については、ユーザーの一意の識別子、つまり電子メール アドレス、要求が行われた日付、および新しいハッシュを入力します。このハッシュは、連結されたこれらの詳細に加えて、ユーザー用に既に保存されているソルトとハッシュから生成されます。
例えば:
Email: user@example.com
Request Date: 2014-07-17
Salt: 1111
Hash: 9999
連結されたものの新しいハッシュを生成します。つまり'user@example.com2014-07-1711119999'
、これが のハッシュを与えるとし7777
ます。
次に生成する URL には、電子メール、要求日、および新しいハッシュが含まれます。
https:\\www.example.com\ResetPassword?email=user@example.com&requestdate=2014-07-17&hash=7777
サーバーは、電子メールと提供された日付をソルトとハッシュと組み合わせて、生成されたハッシュが提供されたものと同じであることを確認します。これが OK の場合、同じ 3 つのパラメーターが背後に隠されているリセット フォームが表示されます。それ以外の場合はエラーです。これらは、フォームのなりすましを防ぐために、新しいパスワードが入力されたときに再送信および再チェックされます。
リクエストを行うには電子メールアドレスを提供する必要があり、同じアドレスにのみ電子メールで送信されます。日付はほとんど特権情報ではなく、ハッシュは元に戻せないため、とにかく何も提供しません。データベースには何も書き込まれておらず、パラメーターが改ざんされるとハッシュが失敗し、URL でエラーが報告されます。