我们在网站上引入了密码加密功能。 盐的计算如下:
Rfc2898DeriveBytes hasher = new Rfc2898DeriveBytes(Username.ToLowerInvariant(),
System.Text.Encoding.Default.GetBytes("Wn.,G38uI{~6y8G-FA4);UD~7u75%6"), 10000);
string salt = Convert.ToBase64String(hasher.GetBytes(25));
对于大多数用户名,salt总是相同的。 但对于某些用户名,它会在每次通话时发生变化。 有人能告诉我我们做错了吗?
答案 0 :(得分:1)
假设你也使用RFC2898DeriveBytes来密码密码本身,那么@CodesInChaos是正确的,你做错了是:
byte[] salt1 = new byte[8];
using (RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider())
{
// Fill the array with a random value.
rngCsp.GetBytes(salt1);
}
然后盐应该与密码哈希和迭代计数一起存储在数据库中的clear中(因此你可以更改它),也可能是版本代码(所以你可以再次更改它,即你当前的计算盐方法是版本1,随机盐是版本2)。
如果您没有使用RFC2898DeriveBytes,另一个PBKDF2实现,BCrypt或SCrypt来进行实际密码散列,那么那 你做错了什么。
修剪用户名,但并非所有时间都是完全包含的;只需确保在密码被散列之前不要修剪密码。