更改后无法识别哈希密码

时间:2015-07-13 07:52:53

标签: c# hash login passwords

我在registration.aspx上就已经密码了。在我的业务层中拥有此代码:

public static string CreateSHAHash(string Phrase)
    {
        SHA512Managed HashTool = new SHA512Managed();
        Byte[] PhraseAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(Phrase));
        Byte[] EncryptedBytes = HashTool.ComputeHash(PhraseAsByte);
        HashTool.Clear();
        return Convert.ToBase64String(EncryptedBytes);
    }

和注册页面中的代码:

scm.Parameters.AddWithValue("@Password", BusinessLayer.ShoppingCart.CreateSHAHash(txtPW.Text));

使用上面的代码,密码将在数据库中进行哈希处理,并且在使用此代码登录时工作正常:

protected void btn_Login_Click(object sender, EventArgs e)
    {
        SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["RegistrationConnectionString"].ConnectionString);
        conn.Open();
        string checkuser = "select count(*) from UserData where Username = '" + txtUser.Text + "'";
        SqlCommand scm = new SqlCommand(checkuser, conn);
        int temp = Convert.ToInt32(scm.ExecuteScalar().ToString());
        conn.Close();
        if (temp == 1)
        {
            conn.Open();
            string checkPassword = "select Password from UserData where Username ='" + txtUser.Text + "'";
            SqlCommand passCom = new SqlCommand(checkPassword, conn);
            string password = passCom.ExecuteScalar().ToString();
            if (password == BusinessLayer.ShoppingCart.CreateSHAHash(txtPassword.Text))
            {
                Session["New"] = txtUser.Text;
                Response.Write("<script>alert('Logged In')</script>");
                Response.Redirect("OrderNow.aspx");
            }
            else
            {
                lblcrederror.Text = ("Credentials dont match");
            }

        }
        else
        {
            lblcrederror.Text = ("Credentials dont match");
        }

但是当我在我的changepassword.aspx中更改此代码时,它不会让我使用我的新密码。

protected void btn_update_Click(object sender, EventArgs e)
    {
        SqlConnection con = new SqlConnection(conn);
        con.Open();
        str = "select * from UserData ";
        com = new SqlCommand(str, con);
        SqlDataReader reader = com.ExecuteReader();
        while (reader.Read())
        {
            if (BusinessLayer.ShoppingCart.CreateSHAHash(txt_cpassword.Text) == reader["Password"].ToString())
            {
                up = 1;
            }
        }
        reader.Close();
        con.Close();
        if (up == 1)
        {
            con.Open();
            str = "update UserData set Password=@Password where UserName='" + Session["New"].ToString() + "'";
            com = new SqlCommand(str, con);
            com.Parameters.Add(new SqlParameter("@Password", SqlDbType.VarChar, 50));
            com.Parameters["@Password"].Value = BusinessLayer.ShoppingCart.CreateSHAHash(txt_npassword.Text);
            com.ExecuteNonQuery();
            con.Close();
            lbl_msg.Text = "Password changed Successfully";
        }
        else
        {
            lbl_msg.Text = "Please enter correct Current password";
        }
    }

我在这里缺少什么?

1 个答案:

答案 0 :(得分:0)

检查50是否截断哈希值。

com.Parameters.Add(new SqlParameter("@Password", SqlDbType.VarChar, 50));

在旁注中,我看到您的解决方案对SQL注入非常开放。

 "select Password from UserData where Username ='" + txtUser.Text + "'";

用户可以在文本框中编写sql语句,并劫持数据库,创建自己的表或删除整个数据库。您应该始终参数化查询。我看到你对Update语句这样做了,但你应该考虑为你的所有变量做这件事。

这会很快创建很多代码,所以我也会考虑制作一个SQL包装器,它包含了你重复的所有内容。当你完成重构时,它看起来像这样:

var sql = new SqlWrapper("select Password from UserData where Username = @username", txtUser.Text);
var dataSet = sql.Execute();

然后你可以隐藏你在这个包装器后面的所有connectionstring,命令++,并且只告诉包装器你真正关心的是什么。

您还应该考虑使用salt作为密码。如果你和我有相同的密码,哈希将是相同的。盐将解决这个问题。

关于密码安全的好文章 - &gt; https://crackstation.net/hashing-security.htm