2016-03-11 1 views
0

Я хотел бы выполнить функцию изменения пароля Ниже показан код и скриншоты, что я сделал до сих пор:Шифрование и дешифрование в функции смены пароля?

 private void Password_Change() 
    { 
     int rowsAffected = 0; 
     string query = "UPDATE staff_user SET staff_password = @newpassword WHERE staff_password = @staff_password"; 
     string constr = ConfigurationManager.ConnectionStrings["dbyouthworkConnectionString"].ConnectionString; 

     ConfirmPassword.Text = Encrypt(ConfirmPassword.Text.Trim()); 
     CurrentPassword.Text = Decrypt(CurrentPassword.Text.Trim()); 
     using (MySqlConnection con = new MySqlConnection(constr)) 
     { 
      using (MySqlCommand cmd = new MySqlCommand(query)) 
      { 
        con.Open(); 


       using (MySqlDataAdapter sda = new MySqlDataAdapter()) 


       { 
        cmd.Parameters.AddWithValue("@staff_password",CurrentPassword.Text); 
        cmd.Parameters.AddWithValue("@newpassword", (ConfirmPassword.Text)); 
        cmd.Connection = con; 


        rowsAffected = cmd.ExecuteNonQuery(); 

        con.Close(); 

       } 


       if (rowsAffected > 0) 
       { 
        Label1.ForeColor = System.Drawing.Color.Green; 
        Label1.Text = "Password has been changed successfully."; 
       } 
       else 
       { 
        Label1.ForeColor = System.Drawing.Color.Red; 
        Label1.Text = "Password does not match with our database records."; 
       } 
       if (CurrentPassword.Text == New_Password.Text) 
       { 
        Label1.ForeColor = System.Drawing.Color.Red; 
        Label1.Text = "Old Password and New Password cannot be the same !"; 
       } 

       if (CurrentPassword.Text == ConfirmPassword.Text) 
       { 
        Label1.ForeColor = System.Drawing.Color.Red; 
        Label1.Text = "Old Password and New Password cannot be the same !"; 
       } 

      } 
     } 
    } 
    private string Encrypt(string clearText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(clearBytes, 0, clearBytes.Length); 
        cs.Close(); 
       } 
       clearText = Convert.ToBase64String(ms.ToArray()); 
      } 
     } 
     return clearText; 
    } 
    private string Decrypt(string cipherText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] cipherBytes = Convert.FromBase64String(cipherText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(cipherBytes, 0, cipherBytes.Length); 
        cs.Close(); 
       } 
       cipherText = Encoding.Unicode.GetString(ms.ToArray()); 
      } 
     } 
     return cipherText; 
    }[![enter image description here][1]][1] 

Однако при запуске проекта Это ошибка, я получаю: enter image description here

Я не могу видеть, где я ушел, так как я использовал ту же функцию расшифровки, когда пользователь входит в систему и функция шифрования, когда пользователь создает учетную запись.

+0

Поскольку пароли никогда не хранятся (зашифрованный или обычный текст), ваш код выглядит странно. Пожалуйста, убедитесь, что фактический код хеширует пароли и не шифрует их, а код в сообщении - это просто образец некоторого случайного поля, зашифрованного/дешифрованного. –

+0

@AlexeiLevenkov Что заставляет вас думать, что «пароли никогда не хранятся (зашифрованные или простые тексты)», уверены, что они не должны быть, но на самом деле они все так часто бывают. – zaph

+0

Вы никогда не должны шифровать пароли своего пользователя. Вместо этого вам нужно использовать хеширование, а некоторые сильные - PBKDF2, bcrypt, scrypt и Argon2. Поскольку хеш-функции являются однонаправленной, вы не сможете «расшифровать» хеши. Чтобы аутентифицировать пользователя, вы можете снова запустить пароль через хеш-функцию, чтобы сравнить с хешем, который хранится в базе данных. Подробнее: [Как безопасно использовать хэш-пароли?] (Http://security.stackexchange.com/q/211/45523) –

ответ

0

В сообщении об ошибке говорится все: «Входные данные не являются полным блоком».

AES - это блок-шифр, он работает с блоком данных за блоком, а блоки имеют размер 16-байтов. Если данные не кратно размеру блока, он должен быть каким-то образом дополнен, обычное заполнение, используемое для AES, равно PKCS#7 né PKCS # 5.

Добавьте этот вариант дополнения к коду шифрования. Заполнение будет добавлено при шифровании и удалено при расшифровке. Вам нужно будет обеспечить, чтобы выходной буфер шифрования был на один блок (16-байтовый) длиннее входных данных.

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

  • Нет связанных вопросов^_^