WPF程序中密码哈希存入SQL数据库后登录验证失败如何解决?
问题原因
- 登录验证时未对用户输入的密码做哈希处理:注册环节你已经将明文密码通过
Utils.hashPassword()计算为哈希值存入数据库,登录时直接拿用户输入的明文密码和数据库存储的哈希值比对,二者内容完全不一致,自然匹配失败。 - 登录逻辑使用字符串拼接SQL语句,存在严重SQL注入风险,攻击者可构造特殊输入绕开身份验证,建议统一使用参数化查询。
修复方案
修改登录按钮的点击逻辑,先将用户输入的密码做相同的哈希计算后再参与查询,同时替换为参数化查询,修复后代码如下:
private void btnLogin_Click(object sender, RoutedEventArgs e) { try { using (SqlConnection connection = new SqlConnection(ConnectionSQL.conn)) { connection.Open(); string Username = txtbUsername.Text; // 对用户输入的登录密码做和注册时一致的哈希处理 string hashedPassword = Utils.hashPassword(txtbPassword.Text); // 改用参数化查询避免SQL注入 string sql = "SELECT * FROM USERTABLE where Username = @Username AND Password = @Password;"; SqlCommand command = new SqlCommand(sql, connection); command.Parameters.AddWithValue("@Username", Username); command.Parameters.AddWithValue("@Password", hashedPassword); SqlDataReader reader = command.ExecuteReader(); if (reader.HasRows) { MessageBox.Show("You Have Successfully Logged In"); MainWindow Main = new MainWindow(); txtbUsername.Text = ""; txtbPassword.Text = ""; this.Hide(); Main.ShowDialog(); this.Show(); } else { MessageBox.Show("Invalid Credentials"); } reader.Close(); command.Dispose(); } } catch (SqlException ex) { Console.WriteLine(ex.ToString()); } Console.ReadLine(); }
可选安全优化
当前你使用的SHA1哈希算法已经被攻破,且没有加盐处理,存在彩虹表破解风险,建议替换为更安全的哈希方案,比如PBKDF2、BCrypt等自带盐值和迭代次数的密码哈希算法。
内容的提问来源于stack exchange,提问作者Sebastian Marshall
相关产品推荐
相关产品推荐

