C# 存储用于注册的盐,以便在登录时使用



我在做某种思维问题。 我为我的 Xamarin.Forms 应用创建了一个注册/登录系统。现在,当我注册一个帐户时,我会对密码进行哈希处理并添加随机盐,但我对登录执行相同的操作。问题是我需要为我在寄存器上使用的密码获取完全相同的盐。

以下是创建盐和盐的 2 个函数:

public String CreateSalt(int size)
{
var rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
var buff = new byte[size];
rng.GetBytes(buff);
return Convert.ToBase64String(buff);
}
public String GenerateSHA256Hash(String input, String salt)
{
byte[] bytes = System.Text.Encoding.UTF8.GetBytes(input + salt);
System.Security.Cryptography.SHA256Managed sha256hashstring =
new System.Security.Cryptography.SHA256Managed();
byte[] hash = sha256hashstring.ComputeHash(bytes);
return Convert.ToBase64String(hash);
}

这是我在注册和登录时使用的代码:

async void btnLogInClicked(object sender, EventArgs args)
{
string username = txtUsername.Text;
string password = txtPassword.Text;
string salt = CreateSalt(16);
string HashedPassword = GenerateSHA256Hash(password, salt);
HashedPassword = HashedPassword.Replace('+', '-');
HashedPassword = HashedPassword.Replace('/', '_');
User user = new User
{
Username = username,
Password = HashedPassword
};
var result =  await App.RestService.Login(user);
if (result != null)
{
App.Current.MainPage = new SideMenuItems();
}
}

我怎样才能做到这一点,并且仍然对每个新生成的密码使用随机盐?

似乎每年我都必须重新学习如何正确散列密码。我只是这样做了,我会尽力在这里解释。

您的问题是,当用户登录时,每次调用CreateSalt时都会生成新的盐。如注释中所述,您需要在注册期间生成一次盐和哈希,并将它们保存到数据库中。

然后,当用户登录时,您可以从数据库中检索盐,并将其与用户输入的密码一起使用以生成哈希。 最后,您将新生成的哈希与保存在数据库中的哈希进行比较,以查看密码是否正确。

我建议使用慢速哈希算法而不是 SHA256 来生成哈希。PBKDF2 将是一个不错的选择,并且内置了 .NET 作为 Rfc2898DeriveBytes 类。另一个流行的选择是bcrypt。它需要在 .NET 中使用第三方库,但我发现它很容易实现(至少使用 Node(。有关密码哈希算法的更多一般信息,请参阅此处。

最后要考虑的是算法使用的迭代次数。Rfc2898DeriveBytes类有几个构造函数,其中一个构造函数设置默认值 1000 次迭代,这应该足够了。迭代(或"成本"(会减慢哈希函数的速度并有助于阻止攻击。

相关内容

  • 没有找到相关文章

最新更新