パスワードの安全なハッシュ: 完全ガイド
パスワードを安全に保存することは、ユーザーのプライバシーとセキュリティを維持するために重要です。暗号化は簡単な解決策のように思えるかもしれませんが、この目的には理想的な方法ではありません。一方、ハッシュは、パスワードを安全に保存するために推奨される方法です。
段階的なパスワードハッシュプロセス
ステップ 1: ソルト値を生成する
まず、暗号的に安全な擬似乱数生成器 (PRNG) を使用してランダム ソルト (一意の値) を作成します。
<code class="language-c#">byte[] salt; new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);</code>
ステップ 2: パスワードをハッシュする
次に、PBKDF2 (パスワードベースのキー導出関数 2) アルゴリズムを初期化します。
<code class="language-c#">var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000); byte[] hash = pbkdf2.GetBytes(20);</code>
ステップ 3: ソルトとハッシュを組み合わせる
後で使用できるようにソルトとパスワード ハッシュ バイトを結合します:
<code class="language-c#">byte[] hashBytes = new byte[36]; Array.Copy(salt, 0, hashBytes, 0, 16); Array.Copy(hash, 0, hashBytes, 16, 20);</code>
ステップ 4: ストレージ用にエンコードする
安全に保存できるように、結合されたソルトとハッシュ値を Base64 文字列に変換します。
<code class="language-c#">string savedPasswordHash = Convert.ToBase64String(hashBytes);</code>
ステップ 5: パスワードを確認する
ユーザーが入力したパスワードを保存されたハッシュと照合して検証するには、保存されたハッシュを取得します:
<code class="language-c#">/* 获取存储的值 */ string savedPasswordHash = DBContext.GetUser(u => u.UserName == user).Password;</code>
バイトとソルトを抽出します:
<code class="language-c#">/* 提取字节 */ byte[] hashBytes = Convert.FromBase64String(savedPasswordHash); /* 获取盐值 */ byte[] salt = new byte[16]; Array.Copy(hashBytes, 0, salt, 0, 16);</code>
ユーザーが入力したパスワードのハッシュ値を計算します:
<code class="language-c#">var pbkdf2 = new Rfc2898DeriveBytes(password, salt, 100000); byte[] hash = pbkdf2.GetBytes(20);</code>
比較結果:
<code class="language-c#">/* 比较结果 */ for (int i=0; i < 20; i++) if (hashBytes[i+16] != hash[i]) throw new UnauthorizedAccessException();</code>
これらの手順に従うことで、アプリケーションのパスワードを効率的かつ安全にハッシュ化できます。
以上がPBKDF2 を使用してパスワードを安全にハッシュするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。