我正在使用ASP.NET开发一个网站。我想为我的用户实现登录身份验证。我正在使用SALT HASH方法将用户的密码安全地保存到数据库中。通过查看各种代码,我编写了如下代码来生成SALT和Hashed密码以存储在数据库中。
private string hashedPassword;
private string Salt;
private string SaltPlusPassword;
private const byte saltSize = 24;
byte[] saltArray;
byte[] hashedPasswordArray;
byte[] bytes;
public void Save_Login(string passWord)
{
using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
{
saltArray = new byte[saltSize];
rng.GetBytes(saltArray);
}
Salt = Convert.ToBase64String(saltArray);
SaltPlusPassword = String.Format("{0}{1}", Salt, passWord);
using (SHA256 sha = SHA256.Create())
{
bytes = Encoding.UTF8.GetBytes(SaltPlusPassword);
hashedPasswordArray = sha.ComputeHash(bytes);
}
hashedPassword = Convert.ToBase64String(hashedPasswordArray);
}
// Salt将保存到DB
// hashedPassword将保存到DB。
所以我几乎没有问题。
1)我在一篇文章中读到“让你的盐至少与哈希函数的输出一样长”确定。 saltArray,hashedPasswordArray和在我的代码中声明的字节数组的大小是多少?我使用saltArray大小为24.可以吗?
2)如果我使用会发生什么?
bytes = Encoding.Unicode.GetBytes(SaltPlusPassword);
而不是
bytes = Encoding.UTF8.GetBytes(SaltPlusPassword);
3)我应该使用什么数据类型来存储数据库中的salt和哈希密码? (我的数据库是MYSQL)
4)如果我使用SHA256Managed而不是SHA256,是否有任何性能差异?哪个最好?
5)最后我是以正确的方式做到这一点的吗?上面代码有哪些缺点?你有什么建议吗?
答案 0 :(得分:0)
为什么不使用ASP.NET提供的内置身份管理工具,而不是处理所有这些问题。见这里
http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity
更常见,更健壮。