首页 > 后端开发 > C++ > 如何使用 PBKDF2 在 .NET 中安全地散列密码?

如何使用 PBKDF2 在 .NET 中安全地散列密码?

Barbara Streisand
发布: 2025-01-23 12:32:12
原创
760 人浏览过

How to Securely Hash Passwords in .NET Using PBKDF2?

使用当前最佳实践在 .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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板