You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录验证异常:明文密码无法登录,哈希密码可正常登录求解决方案

问题原因

注册流程中,你将用户输入的明文密码通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:16:15