【问题标题】:Securing users passwords using c# - Rfc2898DeriveBytes vs SHA512使用 c# 保护用户密码 - Rfc2898DeriveBytes vs SHA512
【发布时间】:2017-05-19 13:43:32
【问题描述】:

我一直在阅读有关保护数据库中用户密码的信息 (https://crackstation.net/hashing-security.htm)。基本思路就明白了——生成一个随机Salt,将其附加到密码中,并对密码进行哈希处理。

这就是我所做的(我没有在这里放一些转换为字符串的方法):

RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create();
byte[] rndBytes = new byte[512];
randomNumberGenerator.GetBytes(rndBytes);
string salt = ToHexString(rndBytes);

var sha512Hasher = SHA512.Create();
string hashedPwd = ToHexString(sha512Hasher.ComputeHash(GetBytes(pwd + salt)))

根据文章,这是安全的,但可以通过使用“密钥拉伸”更加安全,据我了解,它是散列较慢(使用参数)以使暴力破解密码更难。

这就是我所做的:

RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create();
byte[] salt = new byte[512];
randomNumberGenerator.GetBytes(salt);
Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(user.Password, salt, 1000);
byte[] hashBytes = k1.GetBytes(512);
string hash = ToHexString(hashBytes);

现在是我的问题:

  1. SHA512Rfc2898DeriveBytes 有什么区别?哪个更安全?
  2. 我应该有更多迭代的更小的盐吗?它会让它更安全吗?
  3. 在 1000 次迭代中它运行得非常快 - 它应该有多慢?半秒?一秒?这里的经验法则是什么?
  4. 在数据库上 - 我应该将字节数组转换为字符串并存储字符串,还是应该将字节数组存储在二进制数据字段中?

编辑(其他问题)

  1. 如果我在重新散列 SHA512 上迭代 1000 次 - 它是否提供相同的安全性?

【问题讨论】:

    标签: c# security hash passwords salt


    【解决方案1】:
    1. SHA512 和 Rfc2898DeriveBytes 有什么区别?

    SHA512 是加密哈希函数,而 Rfc2898DeriveBytes 是密钥派生函数。正如您已经写过的,散列函数太快并且太容易被暴力破解,这就是为什么我们需要具有成本因子的函数,如 BCrypt、SCrypt、PBKDF2 或 Argon2。据我所知,Rfc2898DeriveBytes 使用带有 SHA1 的 HMAC 实现 PBKDF2。这回答了您的另一个问题,即迭代 SHA 的安全性低于 Rfc2898DeriveBytes。

    1. 我应该有更多迭代的更小的盐吗?

    盐和成本因素无关,用途不同。盐防止使用彩虹表,迭代是暴力攻击的反措施。您可以从我的tutorial 获得有关安全密码存储的更多信息。所以不,不要让盐变短。

    1. 应该有多慢?

    当然,这取决于您的服务器和您对安全性的要求,较慢意味着更难暴力破解。经验法则是 50 milliseconds 用于单个哈希。

    1. 在数据库上 - 我应该将字节数组转换为字符串吗?

    这取决于你。字符串更容易处理备份、迁移和调试,而字节数组在数据库中需要的空间更少。也许您还应该看看BCrypt.Net,它会生成包含盐的字符串作为输出,并且易于存储在单个数据库字段[字符串]中。

    【讨论】:

    • 那么根据您所说的第二个示例 - 使用 Rfc2898DeriveBytes 生成盐和迭代比第一个示例更安全?
    • @developer82 - 正确,用于存储密码更安全。
    • 我会在此处添加一条评论,说明密钥拉伸大于底层哈希函数是没有意义的。 OPs PBKDF2 代码的结果长度为 1KB,远远大于应有的长度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多