我在输入密码使用Salt MD5方法。以下是我的代码
protected string GenerateSalt()
{
byte[] data = new byte[0x10];
new RNGCryptoServiceProvider().GetBytes(data);
return Convert.ToBase64String(data);
}
private string HashPassword(string password, string salt)
{
// Create an MD5 hash of the supplied password using the supplied salt as well.
string sourceText = salt + password;
ASCIIEncoding asciiEnc = new ASCIIEncoding();
string hash = null;
byte[] byteSourceText = asciiEnc.GetBytes(sourceText);
MD5CryptoServiceProvider md5Hash = new MD5CryptoServiceProvider();
byte[] byteHash = md5Hash.ComputeHash(byteSourceText);
foreach (byte b in byteHash)
{
hash += b.ToString("x2");
}
// Return the hashed password
return hash;
}
这里我用来创建密码。
string salt = GenerateSalt();
string password = HashPassword(txtpassword.Text, salt);
它工作正常并将密码保存在数据库中。
但是当我尝试登录时,密码并不匹配。
下面是我匹配密码和用户ID的代码
string password = FormsAuthentication.HashPasswordForStoringInConfigFile(txtPassword.Text, "md5").ToString();
SqlCommand com11 = new SqlCommand("For_Login1", con);
com11.CommandType = CommandType.StoredProcedure;
com11.Parameters.AddWithValue("@User_Id", ddl.SelectedItem.Text);
com11.Parameters.AddWithValue("@Password", password);
但是密码与原因不符?
答案 0 :(得分:1)
salt
是一个最终的静态字符串(不会更改),通常保存在附加到散列密码的数据库中。一种惯例是将其保存为hash(pwd+salt):salt
。
每次拨打generate()
时,您都会生成新的盐,原因如下:
new RNGCryptoServiceProvider().GetBytes(data);
这意味着您永远无法进行身份验证。