如果我有这样的代码,我是否能够使用在数据库中散列的密码登录:
string queryLog = "SELECT username, password FROM users WHERE username = @username and password = @password";
using (SqlCommand command = new SqlCommand(queryLog, con))
{
command.Parameters.AddWithValue("@username", LoginUsername_txt.Text);
command.Parameters.AddWithValue("@password", LoginPassword_txt.Text);
con.Open();
SqlDataAdapter adpt = new SqlDataAdapter(command);
DataSet dts = new DataSet();
adpt.Fill(dts);
con.Close();
if (dts.Tables[0].Rows.Count >= 1)
{
passingText = LoginUsername_txt.Text;
this.Hide();
Work_Orders d = new Work_Orders();
d.ShowDialog();
}
else MessageBox.Show("Invalid username or password!", "Error signing in!");
}
正如您所看到的,我正在检查我是否从数据库中获得至少1个结果。但是如果在数据库中对密码进行哈希处理会发生什么。
出于安全原因,密码[正确地]存储为哈希;但是一旦哈希,它就会被存储为string
,并且可以直接与那个确切的字符串相媲美。您的代码目前要求您使用散列密码字符串作为密码 - 不是理想的情况......
需要做的是中间步骤:
command.Parameters.AddWithValue("@password", Hash(LoginPassword_txt.Text));
其中string Hash(string password)
是一个函数,它将使用创建帐户时使用的相同散列算法(以及存储在数据库中的密码)来散列密码。
为了能够使用哈希密码登录,您需要使用与之前存储在数据库中的密码相同的算法来散列从Password TextBox
收到的密码,然后将其传递给sql查询。
string hasedPassword = Hash(PasswordTextBox.Text); // TODO: Make a Hash() function
command.Parameters.AddWithValue("@geslo", hasedPassword );