登录验证异常:明文密码无法登录,哈希密码可正常登录求解决方案
问题原因
注册流程中,你将用户输入的明文密码通过SHA256算法哈希后存入数据库;但登录流程里,你直接用明文密码与数据库中存储的哈希值做比对,两者自然不匹配,导致验证失败。
解决方案
登录时,对用户输入的明文密码执行与注册时完全一致的SHA256哈希处理,再用哈希后的结果去和数据库中的密码哈希值比对即可。
具体修改步骤
1. 复用哈希逻辑(推荐提取为公共方法)
为避免代码重复,建议把哈希密码的逻辑提取到公共工具类中:
public static class PasswordHelper { public static string HashPassword(string password) { using (var sha256 = new SHA256Managed()) { var hashBytes = sha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password)); return BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); } } }
如果不想提取公共类,也可以直接把HashPassword方法复制到Login Window类中。
2. 修改登录验证逻辑
修改Login Window的ButtonSubmit_Click方法,先对输入的明文密码哈希,再执行数据库查询:
private async void ButtonSubmit_Click(object sender, RoutedEventArgs e) { // 对输入的明文密码进行哈希处理 string hashedInputPassword = PasswordHelper.HashPassword(TextBoxPassword.Text); // --- 修复第一段SQL验证逻辑(同时修复SQL注入风险)--- string query = "Select count (*) From Login where Username = @Username and Password = @Password"; SqlDataAdapter sqa = new SqlDataAdapter(query, conn); sqa.SelectCommand.Parameters.AddWithValue("@Username", TextBoxUsername.Text); sqa.SelectCommand.Parameters.AddWithValue("@Password", hashedInputPassword); DataTable dt = new DataTable(); sqa.Fill(dt); if (dt.Rows[0][0].ToString() == "1") { this.Hide(); MainWindow main = new MainWindow(); main.Show(); } else { MessageBox.Show("您输入的信息有误!"); } // --- 修复第二段EF验证逻辑 --- TextBlockResponse.Text = ""; //Spinner.IsLoading = true; StudyTrackerContext context = new StudyTrackerContext(); // 使用哈希后的密码查询用户 var user = await context.users.FirstOrDefaultAsync(b => b.username == TextBoxUsername.Text && b.password == hashedInputPassword); if (user == null) { TextBlockResponse.Text = "您输入的信息有误!"; } else { TextBlockResponse.Text = "登录成功!欢迎 " + user.username; } Spinner.IsLoading = false; }
额外提示
- 原登录代码中的第一段SQL查询存在SQL注入漏洞,改用参数化查询可避免该安全问题。
- SHA256单独使用安全性有限,建议后续加入盐值(Salt)进一步提升密码存储的安全性。
内容的提问来源于stack exchange,提问作者dcgamingbro
相关产品推荐
相关产品推荐

