現在のベスト プラクティスを使用して、.NET でパスワードを安全にハッシュ化します
パスワードをデータベースに保存する場合、ハッシュ アルゴリズムを使用して機密情報を保護することが重要です。暗号化方式はこの目的には適していません。 .NET で最適なネイティブ パスワード ハッシュ アルゴリズムは、PBKDF2 (Password-Based Key Derivation Function 2) です。
PBKDF2 を使用したパスワードハッシュのステップバイステップガイド
ステップ 1: ソルト値を生成する
ソルトは、各パスワードのハッシュを一意にするために使用されるランダムな値です。暗号化 PRNG (擬似乱数ジェネレーター) を使用してソルト値を作成します:
<code class="language-csharp">byte[] salt; new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);</code>
ステップ 2: PBKDF2 オブジェクトを作成し、ハッシュ値を計算します
Rfc2898DeriveBytes
クラスをインスタンス化し、パスワード、ソルト、および必要な反復回数 (~100,000 を推奨) を指定します。
<code class="language-csharp">var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000); byte[] hash = pbkdf2.GetBytes(20);</code>
ステップ 3: ソルトと暗号バイトを組み合わせて保存する
ソルトバイトとパスワードバイトを組み合わせて、データベースストレージ用の単一の文字列を作成します:
<code class="language-csharp">byte[] hashBytes = new byte[36]; Array.Copy(salt, 0, hashBytes, 0, 16); Array.Copy(hash, 0, hashBytes, 16, 20);</code>
ステップ 4: 保存用に Base64 文字列に変換する
データベースに保存するために、結合されたバイトを Base64 文字列にエンコードします:
<code class="language-csharp">string savedPasswordHash = Convert.ToBase64String(hashBytes);</code>
ステップ 5: ユーザーが入力したパスワードを確認します
ユーザーが入力したパスワードが保存されているハッシュと一致することを確認するには:
<code class="language-csharp">string savedPasswordHash = DBContext.GetUser(u => u.UserName == user).Password; byte[] hashBytes = Convert.FromBase64String(savedPasswordHash); byte[] salt = new byte[16]; Array.Copy(hashBytes, 0, salt, 0, 16); var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000); byte[] hash = pbkdf2.GetBytes(20); for (int i=0; i < 20; i++) if (hashBytes[i+16] != hash[i]) throw new UnauthorizedAccessException();</code>
注: 反復回数は、アプリケーションのパフォーマンス要件に基づいて調整できます。一般に推奨される最小値は 10,000 です。
以上がPBKDF2 を使用して .NET でパスワードを安全にハッシュする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。