パスワードリセットリンクをMVC
とC#
に作成することをお勧めしますか?つまり、ランダムトークンを作成します。ユーザーに送信する前にそれをどのようにエンコードするのですか? MD5は十分ですか?あなたは他の安全な方法を知っていますか?パスワードリセットリンクの作成方法は?
答えて
私はあなたがこの目的のために暗号化された文字列を必要とは思わない。 Guidで1つの文字列を作成すれば十分でしょう。
string thatString=Guid.NewGuid("n").ToString();
これを特定のユーザーアカウントに対してdbテーブルに保存します。この文字列を持つユーザーのリンクを作成し、それらのユーザーに送信します。ユーザーがクリックすると、アクションメソッドが呼び出され、保存されたこの一時文字列に対応するユーザーレコードが取得され、ユーザーがパスワードを更新するフォームが表示されます。
Guidがユニークであるかどうかが疑わしい場合は、thisを確認してください。
ユニーク!=ランダム。 [GUIDはランダムに設計されていません。](http://blogs.msdn.com/b/ericlippert/archive/2012/05/07/guid-guide-part-three.aspx)これらは予測不可能なものではありません。彼らは単に繰り返さないように設計されています。 – Servy
私はこのアプローチも、Guidを使用します。一意性に悩まされている場合は、データベースにすでに存在しているかどうかを確認できます。私はまたそれにタイムラインを設定します(リンクは2時間だけクリック可能です)ので、衝突の可能性をさらに制限します。 – Michel
暗号で安全な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);
}
は、塩にハッシュです。ここでは、セキュリティの第一人者からの抜粋です:
@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
は、基本的には、パスワードを作成します。それをここで塩とハッシュしてから、ユーザーが戻ったときに比較してください。リンクされた答えには、比較方法と塩/ハッシュの深い説明が含まれています。
実際、私はこれらのことをしません。
私は同じ問題に直面し、リセットトークンを送信することにしました。これを行うには、JWTトークンを使用しました。
このトークン(暗号化されています)では、有効期限を設定できます。顧客の電子メールアドレスをクレームとして含むリセットトークンを作成し、有効期限を設定し、これをデータベース(暗号化された形式)に保存してエンコードし、URLパラメータとしてリンクに配置するだけです。
次に、要求を受け取ると、トークンが有効であることを確認できます。その後、メールアドレスを確認してから、自分のアカウントの安全なパスワードリセット領域に移動してください。 (あなたはユーザー名などの他の主張を含めることができます)。
あなたはInstall-Package JWT
このトークンのデバッグではどうしますか?この種のトークンのすべての情報を抽出することができます:電子メール、有効期限... –
- 1. パスワードリセットリンクがhttpsで動作しない
- 2. パスワードリセットリンク有効期限
- 3. パスワードリセットリンクを送信した後にカスタムメールを変更する方法
- 4. アクティベーション/パスワードリセットリンクを構築する最も良い方法
- 5. Laravel5.3のパスワードリセットリンクを変更するには?
- 6. マスターデータベースの作成方法は?
- 7. スタンドアロンデータベースアプリケーションの作成方法は?
- 8. ユニバーサルアプリケーションの作成方法は?
- 9. バックグラウンドアプリケーションの作成方法は?
- 10. ビデオグリッドの作成方法は?
- 11. ARRAYの作成方法は?
- 12. メディアセクションの作成方法は?
- 13. オーバーレイモバイルメニューの作成方法は?
- 14. フォントアイコンの作成方法は?
- 15. movingPlatformの作成方法は?
- 16. リジッドアーキテクチャーの作成方法は?
- 17. スライドアニメーションの作成方法は?
- 18. イテレータの作成方法は?
- 19. リアルタイムマルチライングラフの作成方法は?
- 20. リボンプロットの作成方法は?
- 21. テンプレートの作成方法は?
- 22. XWalkWebResourceResponseの作成方法は?
- 23. マップテキストテキストオブジェクトの作成方法は?
- 24. パラレルパイプラインの作成方法は?
- 25. モーダルウィンドウの作成方法は?
- 26. フローティングヘルプレイアウトの作成方法は?
- 27. Oracle:spfile.oraの作成方法は?
- 28. ビデオフィルフレームの作成方法は?
- 29. サブワーカーの作成方法は?
- 30. エクスポートドッカーの作成方法は?
ほとんどの暗号化ライブラリは、暗号乱数を生成するためのツールを持って入力することができimplemnetation JWTを取得します。何かをハッシュ、エンコード、または暗号化する必要はありません。ランダムな乱数が必要なのは、 'Random'クラスが提供できるものだけです。 – Servy