如果我使用这样的东西创造盐:
public class User
{
private const int Hash_Salt_Length = 8;
private byte[] saltBytes = new byte[Hash_Salt_Length];
public User()
{
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetNonZeroBytes(saltBytes);
}
....
}
saltBytes
个字节数组对于每个会话都是不同的(重新启动应用程序)。如何检查密码以允许用户登录我们的应用程序?
答案 0 :(得分:8)
您需要将salt与密码哈希一起存储在数据库中。
请注意,您不应该调用GetNonZeroBytes
,因为这样可以减少随机性。
答案 1 :(得分:3)
如果每次应用程序重新启动时salt都会更改,则必须将其存储在数据库中(在用户记录中)。
答案 2 :(得分:1)
在您创建用户记录时生成的盐是静态的,并且您将它与用户ID以及密码+ salt的哈希值一起存储。
当用户尝试登录时,您使用ID查找salt,将其与密码相结合,哈希并与存储的哈希进行比较。如果他们匹配,他们就在。
存在盐,以便有权访问您的安全数据库的攻击者无法预先准备密码数据库 - >哈希映射,然后执行简单的反向查找以尝试确定密码。