web-dev-qa-db-ja.com

パスワードをリセットするための一時的なURLを生成する

Webサイトにパスワードを忘れた場合の機能を実装したいと考えています。一時的に使用する一時的なURLを含むメールが、しばらくするとユーザーに送信されるオプションが気に入っています。

これらのアイデアを得るために次のページを確認しましたが、ASP.NETとC#を使用してこれを実装する方法がわかりません。ユーザーの1人が示したように、データベース内にこの情報を保存せずにこれを実装できる場合、それは理想的です。お知らせ下さい。

一時的なパスワードをメールで送信してパスワードをリセット

ありがとう。

28
Pratik Kothari

おそらく最も簡単な方法は、ユーザーテーブルを変更して2つの列を追加することです。OR既存のテーブルを変更したくない場合は、「UserPasswordReset」という新しい依存テーブルを追加できます。 "またはそのようなものです。列は次のようになります:

PasswordResetToken UNIQUEIDENTIFIER,
PasswordResetExpiration DATETIME

追加のテーブルルートを使用する場合は、UserID列を追加して、それを主キーにし、ユーザーテーブルへの外部キー参照にすることもできます。 UNIQUE制約も推奨されます。次に、asp.netアプリケーションのGuidをトークンとして使用します。

フローは次のようになります。

  1. ユーザーが自分のアカウントのパスワードのリセットを要求する
  2. PasswordResetExpirationを将来の日付に設定して(DateTime.Now.AddDays(1))、テーブルに新しいレコードを挿入(またはユーザーレコードを更新)し、トークンをGuid.NewGuid()に設定します。
  3. クエリ文字列にguidを含むResetPassword.aspxページへのリンクをユーザーにメールで送信します( http://www.yoursite.com/ResetPassword.aspx?token=Guid-here
  4. ResetPassword.aspxページを使用して、トークンと有効期限のフィールドを検証します。 (つまり、DateTime.Now <PasswordResetExpirationであることを確認してください)
  5. ユーザーがこのパスワードをリセットできる簡単なフォームを提供します。

データベースの変更を避けたかったのは確かですが、おそらくこれがおそらく最も簡単な方法です。

65
Scott Anderson

@アレックス

ハッシュアルゴリズムには、.NETのSystem.Security.Cryptographyクラスを使用することもできます。例えば:

using System.Security.Cryptography;
...
var hash = SHA256CryptoServiceProvider.Create().ComputeHash(myTokenToHash);
...
2
Rick Putnam

私は間違いなくこのプロセスにデータベースを含めます。リセットが要求されたら、アカウントがロックアウトされていることを示すことをお勧めします。

たとえば、アカウントが侵害された可能性があると考えてパスワードを変更している場合、変更プロセスを実行している間、アカウントにアクセス可能な状態を維持したくはありません。

また、リセットトークンに「実際の」情報が含まれていることは、誰かが本当にそれを望んでおり、馬力がある場合にデコードされる可能性があります。ランダムな文字列を生成し、そのユーザーの行のdbに保存してから、リンクがクリックされたときにキーに戻る方が安全です。

これにより、次の2つが得られます。

1)復号化するものは何もないため、そこから価値を得ることができません。 2)ユーザーレコード内のトークンの存在は、リセットが進行中であり、アカウントはロックアウトされたものとして扱われるべきであることを示しています。

1
user813006

ここでは、あなたの友達のSystem.Guidクラスが一意の(十分に一意の)128ビット数を生成するためです。

  • 新しいGuidを生成する(System.Guid.NewGuid())
  • そのGuidをどこかに保存します(おそらくアプリケーションオブジェクトですか?)
  • そのGuidを含むメールでカスタムURLを送信する
  • ユーザーがサイトにアクセスしたら、メールで送信したパスワードを入力してもらいます
  • パスワードが一致する場合は、先に進んで強制的に新しいパスワードを入力してください
1
Goyuix

私はハッシュクラスを使用して、現在の日付/時刻とユーザーのメールアドレスで構成される一意の自動ログインを作成しました。

string strNow = DateTime.Now.ToString();
string strHash = strNow + strEmail;
strHash = Hash.GetHash(strHash, Hash.HashType.SHA1);

ハッシュクラスを取得: http://www.developerfusion.com/code/4601/create-hashes-md5-sha1-sha256-sha384-sha512/

次に、以下を使用してURLから取得します。

if (Request.QueryString["hash"] != null)
{
                //extract Hash from the URL
                string strHash = Request.QueryString["hash"];
}
1
Alex

ユーザーのメールにデータ|文字列を送信する目的は、アカウント所有者の検証です。いくつかの点に注意してください:

  • リセットまたはアクティブ化リンクで重要な情報を送信しないでください。
  • ユーザーアカウントと組み合わせて一意の文字列データを保存し、そのリンクとして送信するのが最良の方法です。ただし、ユーザーのメールへのリンクとして1つのセクションだけを送信し、ページでチェックインする場合、ブルートフォース攻撃者または辞書攻撃者によってアプリケーションが危険にさらされる可能性があることに注意してください。文字列のリストをチェックしてリンクを見つけ、パスワードを変更するだけで十分です。私はそれが少しのチャンスがあることを知っていますが、ゼロではありません。

結果:あなたはそれが良いと思います

  1. ユーザーのメールと文字列リンクを組み合わせて暗号化し(ハッシュ値は逆にできないため、ハッシュではありません)、ユーザーのメールに送信します。
  2. ユーザーがクリックすると、ページが暗号化された値を取得します。
  3. 値を復号化します。
  4. ユーザーのメールを抽出します。
  5. データベースでメールを検索します。
  6. 受信したリンクの文字列を、データベース内のユーザーのメールに添付されている他のリンクと比較します。

幸運を。

0
QMaster

ハッシュコードを使用して、パスワードリセットURLの詳細を検証します。これはすべて、DBに何かを書き込んだり、権限のある情報を取得者に送信したりせずに実行できます。

通常のパスワードソルトとハッシュについて簡単に説明します。 saltが1111で、パスワードがpasswordだとすると、2つを連結して文字列1111passwordをハッシュします。これにより、9999のハッシュが得られます。次に、元のソルト1111とハッシュ9999をユーザーレコードに保存します。

パスワードを検証するときは、保存されているソルトを使用し、パスワードの試行を連結し、ハッシュして、保存されているハッシュと比較します。たとえば、asecret1111asecretになりますが、8888にハッシュされます。これは元のハッシュと一致しないため、パスワードの一致は失敗します。

もちろん、saltとhashは通常、適切に生成され、確立された暗号ライブラリで計算されます(自分で作成しないでください!)。

パスワードリセットURLの場合、ユーザーの一意の識別子(電子メールアドレス)、要求が行われた日付、および新しいハッシュを入力します。このハッシュは、一緒に連結された詳細に加えて、ユーザー用にすでに保存されているソルトとハッシュから生成されます。

例えば:

Email: [email protected]
Request Date: 2014-07-17
Salt: 1111
Hash: 9999

連結されたものの新しいハッシュ、つまり'[email protected]'を生成します。これにより、7777のハッシュが得られると言います。

次に、生成するURLには、電子メール、要求日、および新しいハッシュが含まれます。

https:\\www.example.com\[email protected]&requestdate=2014-07-17&hash=7777

サーバーは、電子メールと指定された日付をソルトおよびハッシュと組み合わせ、生成されたハッシュが指定されたものと同じであることを確認します。これがOkの場合、同じ3つのパラメータが背後に隠されたリセットフォームが表示されます。それ以外の場合はエラーになります。これらは再送信され、新しいパスワードが入力されると再確認され、フォームのなりすましを防ぎます。

リクエストを行うにはメールアドレスを指定する必要があります。メールアドレスは同じアドレスにのみ送信されます。日付はほとんど特権化された情報ではなく、ハッシュは元に戻すことができないため、何も与えられません。データベースには何も書き込まれておらず、パラメーターを改ざんするとハッシュが失敗し、URLがエラーを報告します。

0
Stephen Turner

このアプローチには問題があります。安全なハッシュはトークンを本当に長くします。ソルトをハッシュ自体に統合する(約20文字長くする)か、この固有のソルトをデータベースに保存します。ソルトをデータベースに格納する場合、既存のトークンから派生していないランダムトークンを格納することもできます。

0
Sandeep yadav