如果我有这样的代码,我将能够使用密码散列在数据库中登录:
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个结果。但是,如果密码在数据库中散列,会发生什么情况。
答案 0 :(得分:1)
出于安全原因,密码[正确地]存储为哈希值;但是一旦进行哈希处理,它就会存储为string
,并且可以直接与该确切的字符串进行比较。您的代码当前需要您使用散列的密码字符串作为密码-不是理想的情况...
需要发生的是一个中间步骤:
command.Parameters.AddWithValue("@password", Hash(LoginPassword_txt.Text));
string Hash(string password)
是一个函数,它将使用创建帐户时使用的相同哈希算法(以及存储在数据库中的密码)对密码进行哈希处理。
答案 1 :(得分:0)
要能够使用哈希密码登录,您需要使用之前对数据库中存储的密码进行哈希处理的相同算法对从Password TextBox
收到的密码进行哈希处理,然后将其传递给sql查询。
string hasedPassword = Hash(PasswordTextBox.Text); // TODO: Make a Hash() function
command.Parameters.AddWithValue("@geslo", hasedPassword );