2015-07-13 2 views
1

Я получил свой пароль прямо здесь, в 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 [email protected] 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"; 
     } 
    } 

Что мне здесь не хватает?

+3

ли он обновляется в базе данных? Является ли пароль hash короче после того, как вы его изменили? Может быть, 50 усекает хэш? –

+0

хорошая идея! lemme check –

+0

Вы легенда. любой способ, которым я могу это сделать? @ BjørnØyvindHalvorsen –

ответ

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, команды ++ за этой оберткой и говорить только обертка, что вы на самом деле заботитесь о.

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

Хорошая статья о безопасности пароля ->https://crackstation.net/hashing-security.htm

+0

Не убежден в необходимости использования SqlWrapper.Я считаю, что это просто затрудняет понимание кода другим, поскольку они должны пробираться через ваш (плохо написанный?) Код обертки, чтобы получить то, что у них уже есть (библиотеки .Net). SqlParameters могут быть созданы и добавлены в одну строку. – Polyfun

+0

Это называется фасадным рисунком. Создание чего-то сложного, простого. Будучи разработчиком, я каждый день читаю множество загрузок. Чем меньше строк кода я должен прочитать, чтобы понять, тем лучше. Напишите хорошие фасады, что имеет смысл, и это достаточно динамично для вашего использования. Это хорошая практика, и рекомендуется -> https://en.wikipedia.org/wiki/Facade_pattern SqlParameters, SqlConnection и SqlCommand отвлечены .... хорошая вещь ... –

+0

Я понимаю это, но по моему опыту средний программист не очень хорош в написании фасадов, и я не думаю, что это оправдано для чего-то, также понимаемого как System.Data.SqlClient, который уже является фасадом. Во что бы то ни стало, создайте фасад для ваших собственных библиотек. – Polyfun

Смежные вопросы