Попытка обновить хешированный пароль c # - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь обновить свою базу данных новым хешированным паролем на 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 голосов
/ 22 мая 2018

Я предполагаю, что вы используете более новую версию библиотеки bcrypt https://www.nuget.org/packages/BCrypt.Net-Next/, а не старую с ошибками.

Во-первых, не вырабатывайте соль самостоятельно, это обсуждается в библиотеке.

Вы можете безопасно создать новый хэш пароля, просто набрав

var myNewHash = BCrypt.ValidateAndReplacePassword(currentPassword, currentHash, newPassword);

Это, конечно, вынуждает процесс требовать, чтобы пользователь ввел свой текущий пароль, чтобы изменить свой пароль (это лучшая практика).

Если вы делаете это в смысле сброса пароля, вы должны хешировать пароль, используя

var myNewHash = BCrypt.HashPassword("newpassword");

Как указано в начале readme https://github.com/BcryptNet/bcrypt.net

Что касается элемента SQL; Я бы подумал об использовании EF или Dapper.Net поверх прямых манипуляций с ADO. Параметризация SQL не является надежной защитой от SQLI Примеры внедрения SQL даже при использовании SQLParameter в .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
    }
  }

Отказ от ответственности: я являюсь автором указанного репо

Пример кода для ADO от https://www.mikesdotnetting.com/article/113/preventing-sql-injection-in-asp-net

...