使用当前最佳实践在 .NET 中安全地哈希密码
在数据库中存储密码时,使用哈希算法保护敏感信息至关重要。加密方法不适用于此目的。.NET 中最好的原生密码哈希算法是 PBKDF2(基于密码的密钥派生函数 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中文网其他相关文章!