尝试更新散列密码c#

Posted

技术标签:

【中文标题】尝试更新散列密码c#【英文标题】:Trying to update hashed password c# 【发布时间】:2018-05-15 23:45:23 【问题描述】:

我正在尝试使用更改密码表单在 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;
        

【问题讨论】:

您如何验证密码是否被更改?您是否看到标签文本更改为“密码更改成功”? 我将验证码存储在别处,因为不管有没有它,它仍然没有更新。是的,我总是看到标签。该死,这很难哈哈。 @Pedro Sanches,在你的 try catch 中你能添加一个控制台/调试行来打印异常吗?目前你捕获了一个异常但没有做任何事情 @Pedro,还有为什么你需要 cmd1.Parameters.AddWithValue("@password", txtOld.Text.Trim());无论如何,您都没有在该查询中使用它尝试删除它 您是否还需要存储新的哈希?否则,当他们再次登录时,您将如何验证用户的密码。或者因为它是哈希密码的prepended,也许算法会处理它? 【参考方案1】:

我假设您使用的是较新版本的 bcrypt 库 https://www.nuget.org/packages/BCrypt.Net-Next/,而不是有错误的旧版本。

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

您只需调用即可安全地生成新密码哈希

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
    
  

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

来自https://www.mikesdotnetting.com/article/113/preventing-sql-injection-in-asp-net 的 ADO 代码示例

【讨论】:

当你使用 EF 调用存储过程并使用这些参数创建 sql 命令时,你会遇到与 ADO 相同的漏洞 @HansKesting 确实存在使用任何库的坏方法。 @PedroSanches 好东西;如果您有任何问题,请告诉我;我在推特上 ala chrismckee

以上是关于尝试更新散列密码c#的主要内容,如果未能解决你的问题,请参考以下文章

使用 MD5 或 sha-256 C# 散列密码

在 C# 中存储使用 MD5CryptoServiceProvider 散列的密码是不是安全?

散列或加密或两者都存储用户的密码? C# Winforms [关闭]

Spring Security 批量密码散列

将传入凭据与 Oracle 散列密码进行比较

当我在客户端散列密码时,我没有得到散列字符串,而是获取密码本身