试图更新散列密码c#

时间:2018-05-15 23:45:23

标签: c# asp.net bcrypt

我正在尝试使用更改密码表格在asp.net上使用新的哈希密码更新我的数据库,但它不起作用,也没有给我错误。

我正在使用bcrypt进行散列。注册和登录工作正常,但更改散列密码很困难。

        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["dbconnection"].ConnectionString);
        con.Open();
       //Select
       string query = "select password from Users where name=@name";

      SqlCommand cmd = new SqlCommand(query, con);
        cmd.Parameters.AddWithValue("@password", txtOld.Text.Trim());
        cmd.Parameters.AddWithValue("@name", LblUser.Text);





        //Update
        try { 
        string queryupdate = "UPDATE Users SET password=@newpassword WHERE name=@name";
            SqlCommand cmd1 = new SqlCommand(queryupdate, con); 
            string salt = BCr.BCrypt.GenerateSalt(12);
            // if you look at the hashed password, notice that it's prepended with the salt generated above
            string hashedPassword = BCr.BCrypt.HashPassword(txtConfirm.Text.Trim(), salt);
            cmd1.Parameters.AddWithValue("@name", LblUser.Text);
            cmd1.Parameters.AddWithValue("@newpassword", hashedPassword);
            cmd1.Parameters.AddWithValue("@password", txtOld.Text.Trim());
            cmd1.ExecuteNonQuery();
            LblUser.Text = "Password changed successfully";
            LblUser.ForeColor = System.Drawing.Color.Green;



        }

        catch(Exception ex)
        { 
           LblUser.Text = "Something Went Wrong";
           LblUser.ForeColor = System.Drawing.Color.Red;
        }

1 个答案:

答案 0 :(得分:0)

我假设你正在使用较新版本的bcrypt库https://www.nuget.org/packages/BCrypt.Net-Next/而不是旧版本的bug。

首先,不要自己生成盐,这将在库中处理。

只需调用

即可安全地生成新密码哈希
var myNewHash = BCrypt.ValidateAndReplacePassword(currentPassword, currentHash, newPassword);

这当然迫使进程要求用户输入他们当前的密码才能更改密码(这是最佳做法)。

如果您在密码重置的意义上执行此操作,则应使用

对密码进行散列
var myNewHash = BCrypt.HashPassword("newpassword");

正如自述文件https://github.com/BcryptNet/bcrypt.net

开头所述

至于SQL元素;我考虑使用EF或Dapper.Net而不是直接ADO操作。 SQL参数化不是针对SQLI Examples of SQL injection even when using SQLParameter in .NET?

的万无一失的保护

如果你正在使用ADO,请确保指定参数类型ala

  var connect = ConfigurationManager.ConnectionStrings["NorthWind"].ToString();
  var query = "Select * From Products Where ProductID = @ProductID";
  using (var conn = new SqlConnection(connect))
  {
    using (var cmd = new SqlCommand(query, conn))
    {
      cmd.Parameters.Add("@ProductID", SqlDbType.Int);
      cmd.Parameters["@ProductID"].Value = Convert.ToInt32(Request["ProductID"]);
      conn.Open();

      conn.Open();
      //Process results
    }
  }

免责声明:我是所列回购的作者

来自https://www.mikesdotnetting.com/article/113/preventing-sql-injection-in-asp-net

的ADO代码示例