我正在开发一个使用自定义用户表的项目。此表包含一个密码字段。目前我们将纯文本密码保存到数据库中。我想问的是如何将密码的哈希值保存到表中?我已阅读有关 Rfc2898DeriveBytes 类的信息,但我不知道如何使用它以及如何生成盐以及从开始到结束的整个过程。
你能告诉我我可能会采取什么方法吗?
用户表中的每一行都需要一个盐值吗?如果需要,我从哪里得到这个值?
我正在开发一个使用自定义用户表的项目。此表包含一个密码字段。目前我们将纯文本密码保存到数据库中。我想问的是如何将密码的哈希值保存到表中?我已阅读有关 Rfc2898DeriveBytes 类的信息,但我不知道如何使用它以及如何生成盐以及从开始到结束的整个过程。
你能告诉我我可能会采取什么方法吗?
用户表中的每一行都需要一个盐值吗?如果需要,我从哪里得到这个值?
您在PBKDF2 /的正确轨道上Rfc2898DeriveBytes
。如果您只需要它来散列密码,请查看SimpleCrypto.Net,它基本上是围绕Rfc2898DeriveBytes
.
使用 SimpleCrypto.Net,您可以像这样散列用户的密码:
private ICryptoService cryptoService = new PBKDF2();
private void SetNewPassword(User user, string newPassword)
{
//a new password hash is generated from a generated salt with the default settings
user.Password = cryptoService.Compute(newPassword);
//assigning the generated salt to the user
user.PasswordSalt = cryptoService.Salt;
}
要检查用户是否输入了正确的密码,请使用相同的 salt 计算哈希值,并将其与存储在数据库中的哈希值进行比较:
private bool ValidatePassword(User user, string password)
{
//hash the password with the saved salt for that user
string hashed = cryptoService.Compute(password, user.PasswordSalt);
//return true if both hashes are the same
return hashed == user.Password;
}
另一种安全散列密码的可能性是bcrypt。有一个名为BCrypt.Net的实现。
将密码存储在纯文本字段中不是一个好主意。