【发布时间】: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);
现在是我的问题:
-
SHA512和Rfc2898DeriveBytes有什么区别?哪个更安全? - 我应该有更多迭代的更小的盐吗?它会让它更安全吗?
- 在 1000 次迭代中它运行得非常快 - 它应该有多慢?半秒?一秒?这里的经验法则是什么?
- 在数据库上 - 我应该将字节数组转换为字符串并存储字符串,还是应该将字节数组存储在二进制数据字段中?
编辑(其他问题)
- 如果我在重新散列 SHA512 上迭代 1000 次 - 它是否提供相同的安全性?
【问题讨论】:
标签: c# security hash passwords salt