C# 使用ASP.net在数据库中使用哈希密码存储进行身份验证

C# 使用ASP.net在数据库中使用哈希密码存储进行身份验证,c#,authentication,hash,salt,C#,Authentication,Hash,Salt,请需要帮助来检查用户身份验证密码。在创建用户时,我使用hash+salt对密码进行加密,然后再将其存储到数据库中。我希望用户能够登录与注册密码,我是新的哈希 Html Login.cs SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["MyConn"].ConnectionString); con.Open(); SqlCommand cmd = con.C

请需要帮助来检查用户身份验证密码。在创建用户时,我使用hash+salt对密码进行加密,然后再将其存储到数据库中。我希望用户能够登录与注册密码,我是新的哈希

Html

Login.cs

    SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);
    con.Open();

    SqlCommand cmd =  con.CreateCommand();
    cmd.CommandText = "SELECT AdminID FROM   [User]  WHERE  StaffEmail = '" + txtUsername.Text + "' AND StaffPassword ='" + txtPassword.Text + "'";
    cmd.ExecuteNonQuery();
    DataTable dt = new DataTable();
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    da.Fill(dt);
    foreach (DataRow dr in dt.Rows)
    {
        Session["AdminID"] = dr["AdminID"].ToString();
        Response.Redirect("AppointmentMenu.aspx");
    }

    Response.Write("<script>alert('Please check your Username or Password')</script>");
SqlConnection con=newsqlconnection(WebConfigurationManager.ConnectionString[“MyConn”].ConnectionString);
con.Open();
SqlCommand cmd=con.CreateCommand();
cmd.CommandText=“从[User]中选择AdminID,其中staffmail='”+txtexsername.Text+“'和StaffPassword='”+txtPassword.Text+“”;
cmd.ExecuteNonQuery();
DataTable dt=新的DataTable();
SqlDataAdapter da=新的SqlDataAdapter(cmd);
da.填充(dt);
foreach(数据行dr在dt.行中)
{
会话[“AdminID”]=dr[“AdminID”].ToString();
重定向(“appointmenu.aspx”);
}
回答。写(“提醒('请检查您的用户名或密码')”);

我认为,在散列之前,您需要解决一些其他问题

        SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT AdminID FROM   [User]  WHERE  StaffEmail = @userName AND StaffPassword =@pwd";
        cmd.Parameters.AddWithValue("@userName", txtUsername.Text);
        cmd.Parameters.AddWithValue("@pwd", txtPassword.Text);
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        if (dt != null && dt.Rows.Count >0)
        {
            Session["AdminID"] = dt.Rows[0]["AdminID"].ToString();
            Response.Redirect("AppointmentMenu.aspx");
        }
        else
        {
            Response.Write("<script>alert('Please check your Username or Password')</script>");
        }
SqlConnection con=newsqlconnection(WebConfigurationManager.ConnectionString[“MyConn”].ConnectionString);
SqlCommand cmd=con.CreateCommand();
cmd.CommandText=“从[User]中选择AdminID,其中staffmail=@userName和StaffPassword=@pwd”;
cmd.Parameters.AddWithValue(“@userName”,txtUsername.Text);
cmd.Parameters.AddWithValue(“@pwd”,txtPassword.Text);
DataTable dt=新的DataTable();
SqlDataAdapter da=新的SqlDataAdapter(cmd);
da.填充(dt);
如果(dt!=null&&dt.Rows.Count>0)
{
会话[“AdminID”]=dt.Rows[0][“AdminID”].ToString();
重定向(“appointmenu.aspx”);
}
其他的
{
回答。写(“提醒('请检查您的用户名或密码')”);
}

在将输入表单
txtPassword.Text
发送到数据库之前,必须对其进行哈希运算,方法与注册时使用的方法相同:

    string hashedPass = GenerateSHA256Hash(txtPassword.Text, CreatedSalt(128));
    cmd.CommandText = "SELECT AdminID FROM  [User]  WHERE  StaffEmail = '" + txtUsername.Text + "' AND StaffPassword ='" + hashedPass + "'";

除此之外,
CreateSalt
方法应该是私有的,只能由
GenerateSHA256Hash
访问,该方法应该只获得一个
字符串输入
参数。然后,对于任何输入,
GenerateSHA256Hash
应调用
CreateSalt
方法。

当用户登录时,您对登录密码进行哈希运算,并将其与数据库中的哈希密码进行比较。如果匹配,authenticate=true。您需要保留用于哈希每个密码的salt。仅使用哈希函数是不够的,仅添加salt对提高安全性几乎没有作用。相反,使用随机盐在HMAC上迭代大约100ms,并使用散列保存盐。使用诸如
PBKDF2
(又称
Rfc2898DeriveBytes
)、
password\u hash
/
password\u verify
Bcrypt
等函数和类似函数。关键是让攻击者花费大量时间通过暴力手段查找密码。保护您的用户很重要,请使用安全的密码方法。因此,如果我使用“随机”salt存储密码,那么,在以后的某个日期,用户尝试登录-如何对新的登录尝试进行散列,以便将其与存储的散列密码进行比较?因为我不再有我用来存储密码的salt了…嗨,阿卡利,函数(CreatedSal generatesha256 hash)在注册页面中。我如何才能访问该功能以在登录页面中使用它们。谢谢你的帮助。您需要做的是将一个静态类(MyHashing.cs for ex.)添加到您的应用程序(在您的App_代码文件夹中),并将注册页面中的两个哈希方法放入该类中。这样,这些方法将可以从注册页面和登录页面访问:hashedPass=MyHashing.generatesha256 hash(txtPassword.Text);
        SqlConnection con = new SqlConnection(WebConfigurationManager.ConnectionStrings["MyConn"].ConnectionString);
        SqlCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT AdminID FROM   [User]  WHERE  StaffEmail = @userName AND StaffPassword =@pwd";
        cmd.Parameters.AddWithValue("@userName", txtUsername.Text);
        cmd.Parameters.AddWithValue("@pwd", txtPassword.Text);
        DataTable dt = new DataTable();
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        da.Fill(dt);
        if (dt != null && dt.Rows.Count >0)
        {
            Session["AdminID"] = dt.Rows[0]["AdminID"].ToString();
            Response.Redirect("AppointmentMenu.aspx");
        }
        else
        {
            Response.Write("<script>alert('Please check your Username or Password')</script>");
        }
    string hashedPass = GenerateSHA256Hash(txtPassword.Text, CreatedSalt(128));
    cmd.CommandText = "SELECT AdminID FROM  [User]  WHERE  StaffEmail = '" + txtUsername.Text + "' AND StaffPassword ='" + hashedPass + "'";