6

パスワードリセットリンクをMVCC#に作成することをお勧めしますか?つまり、ランダムトークンを作成します。ユーザーに送信する前にそれをどのようにエンコードするのですか? MD5は十分ですか?あなたは他の安全な方法を知っていますか?パスワードリセットリンクの作成方法は?

+0

ほとんどの暗号化ライブラリは、暗号乱数を生成するためのツールを持って入力することができimplemnetation JWTを取得します。何かをハッシュ、エンコード、または暗号化する必要はありません。ランダムな乱数が必要なのは、 'Random'クラスが提供できるものだけです。 – Servy

答えて

2

私はあなたがこの目的のために暗号化された文字列を必要とは思わない。 Guidで1つの文字列を作成すれば十分でしょう。

string thatString=Guid.NewGuid("n").ToString(); 

これを特定のユーザーアカウントに対してdbテーブルに保存します。この文字列を持つユーザーのリンクを作成し、それらのユーザーに送信します。ユーザーがクリックすると、アクションメソッドが呼び出され、保存されたこの一時文字列に対応するユーザーレコードが取得され、ユーザーがパスワードを更新するフォームが表示されます。

Guidがユニークであるかどうかが疑わしい場合は、thisを確認してください。

+10

ユニーク!=ランダム。 [GUIDはランダムに設計されていません。](http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx)これらは予測不可能なものではありません。彼らは単に繰り返さないように設計されています。 – Servy

+0

私はこのアプローチも、Guidを使用します。一意性に悩まされている場合は、データベースにすでに存在しているかどうかを確認できます。私はまたそれにタイムラインを設定します(リンクは2時間だけクリック可能です)ので、衝突の可能性をさらに制限します。 – Michel

15

暗号で安全なRNGであるSystem.Security.Cryptography.RandomNumberGeneratorを使用してください。それを電子メールに含めるだけでなく、後で検索するためにDBに保存してください。私はそれをハッシュしている点を見ていない。

それはここに文書化されています:乱数を使用してより良いhttp://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator.aspx

using System.Security.Cryptography; 

using(RandomNumberGenerator rng = new RandomNumberGenerator()) { 

    Byte[] bytes = new Byte[8]; 
    rng.GetBytes(bytes); 

    String sendThisInEmailAndStoreInDB = Convert.ToBase64String(bytes); 
} 
1

は、塩にハッシュです。ここでは、セキュリティの第一人者からの抜粋です:

@using System.Security.Cryptography; 
static byte[] GenerateSaltedHash(byte[] plainText, byte[] salt) 
{ 
HashAlgorithm algorithm = new SHA256Managed(); 

byte[] plainTextWithSaltBytes = 
    new byte[plainText.Length + salt.Length]; 

for (int i = 0; i < plainText.Length; i++) 
{ 
    plainTextWithSaltBytes[i] = plainText[i]; 
} 
for (int i = 0; i < salt.Length; i++) 
{ 
    plainTextWithSaltBytes[plainText.Length + i] = salt[i]; 
} 

return algorithm.ComputeHash(plainTextWithSaltBytes);    
} 

あなたがここに彼の答えの詳細を見ることができます:https://stackoverflow.com/a/2138588/1026459

は、基本的には、パスワードを作成します。それをここで塩とハッシュしてから、ユーザーが戻ったときに比較してください。リンクされた答えには、比較方法と塩/ハッシュの深い説明が含まれています。

1

実際、私はこれらのことをしません。

私は同じ問題に直面し、リセットトークンを送信することにしました。これを行うには、JWTトークンを使用しました。

このトークン(暗号化されています)では、有効期限を設定できます。顧客の電子メールアドレスをクレームとして含むリセットトークンを作成し、有効期限を設定し、これをデータベース(暗号化された形式)に保存してエンコードし、URLパラメータとしてリンクに配置するだけです。

次に、要求を受け取ると、トークンが有効であることを確認できます。その後、メールアドレスを確認してから、自分のアカウントの安全なパスワードリセット領域に移動してください。 (あなたはユーザー名などの他の主張を含めることができます)。

あなたは Install-Package JWT

+0

このトークンのデバッグではどうしますか?この種のトークンのすべての情報を抽出することができます:電子メール、有効期限... –

関連する問題