C#存储登录时用于注册的盐
我在思考问题。 我为我的Xamarin.Forms应用程序创建了一个注册/登录系统。现在,当我注册一个帐户时,我散列密码并添加随机盐,但我对登录做同样的操作。问题是,我需要获得与我在注册表上使用的密码完全相同的密码 以下是创建salt和hasing的两个函数:C#存储登录时用于注册的盐,c#,security,xamarin.forms,hash,salt,C#,Security,Xamarin.forms,Hash,Salt,我在思考问题。 我为我的Xamarin.Forms应用程序创建了一个注册/登录系统。现在,当我注册一个帐户时,我散列密码并添加随机盐,但我对登录做同样的操作。问题是,我需要获得与我在注册表上使用的密码完全相同的密码 以下是创建salt和hasing的两个函数: public String CreateSalt(int size) { var rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); var
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();
}
}
我如何才能做到这一点,并且仍然对每个新生成的密码使用随机salt?似乎每年我都必须重新学习如何正确地散列密码。我刚才就这么做了,我会尽力解释的 您的问题是,当用户登录时,每次调用
CreateSalt
,您都会生成一个新的salt。如注释中所述,您需要在注册期间生成一次salt和hash,并将它们保存到数据库中
然后,当用户登录时,您可以从数据库中检索salt,并将其与用户输入的密码一起使用以生成哈希。最后,将新生成的哈希与保存在数据库中的哈希进行比较,以查看密码是否正确
我建议使用慢速散列算法,而不是SHA256来生成散列。PBKDF2将是一个很好的选择,并且内置了.NET作为类。另一个流行的选择是bcrypt。它需要一个.NET中的第三方库,但我发现它很容易实现(至少对于Node是如此)。更多关于密码哈希算法的一般信息
最后要考虑的是算法使用的迭代次数。
Rfc2898DeriveBytes
类有几个构造函数,其中一个将默认值设置为1000次迭代,这应该足够了。迭代(或“成本”)降低了哈希函数的速度,有助于阻止攻击。首先,对登录进行哈希和盐/哈希不是有点不寻常吗?你指的是用户名/电子邮件吗?我用用户名和密码登录。现在在注册页面上,我对密码进行了salt/hash操作,但在登录时我也做了同样的操作。。。。问题是密码永远不会以这种方式匹配!请分享你的一些代码。我们需要知道你现在在哪里。我添加了代码。。。。登录和注册几乎是一样的,除了我调用的函数!salt不是秘密的,您通常使用散列值未加密地存储它的值。登录时,您将为用户查找保存的salt,并在验证密码时使用它。