2012-05-17 1 views
0

Я пытаюсь реализовать форму входа в WPF на основе C# с использованием MySQL. Бой мой код. Когда я пытаюсь запустить программу все кажется хорошо, но когда я пытаюсь заполнить информацию я получаю ошибку на линии:Хеширование пароля в форме входа с использованием WPF на основе C#

salt = cmd.ExecuteScalar() as string; 

Он говорит, что: «соль» Неизвестная колонки в «списке поля» на линии , Я попытался создать столбцовую соль в моей таблице. Сначала я не вводил данные и получал «Неверные данные», затем я вставил те же данные, что и мой пароль, и получил ту же ошибку: «Неверные детали». Как бы вы ни поняли, как я могу решить свою проблему?

Вот мой код, где заменили конфиденциальные данные:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using MySql.Data.MySqlClient; 
using System.Security.Cryptography; 
using System.Security.Authentication; 
using System.Security.Permissions; 
using System.Security.AccessControl; 
using System.Security.Policy; 
using System.Security.Principal; 
using System.Security.Util; 




namespace ECBSRecruitmentAgencySoftware 
{ 
    public partial class LogIn : Form 
    { 

     public LogIn() 
     { 

      InitializeComponent(); 

     } 

    static byte[] GenerateSaltedHash(string plainText, string salt) 
    { 
     HashAlgorithm algorithm = new SHA256Managed(); 

     byte[] plainTextBytes = System.Text.Encoding.Unicode.GetBytes(plainText); 
     byte[] saltBytes = Convert.FromBase64String(salt); 

     byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length]; 
     saltBytes.CopyTo(plainTextWithSaltBytes, 0); 
     plainTextBytes.CopyTo(plainTextWithSaltBytes, salt.Length); 

     byte[] hash = algorithm.ComputeHash(plainTextWithSaltBytes); 

     return hash; 
    } 

     public bool tryLogin(string username , string password) 
     { 
      using (var con = new MySqlConnection("host=tara.rdb.superhosting.bg;user=sozopouk;password=27051996;database=sozopouk_test2;")) 
      { 
       con.Open(); 

       var salt = string.Empty; 

       using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username", con)) 
       { 
        cmd.Parameters.AddWithValue("@username", username); 

        salt = cmd.ExecuteScalar() as string; 
       } 

       if (string.IsNullOrEmpty(salt)) return false; 

       var hashedPassword = GenerateSaltedHash(password, salt); 

       using (var cmd = new MySqlCommand("Select * FROM niki WHERE user_name = @username and user_password = @password", con)) 
       { 
        cmd.Parameters.AddWithValue("@username", username); 
        cmd.Parameters.AddWithValue("@password", hashedPassword); 

        using (var reader = cmd.ExecuteReader()) 
        { 
         return reader.Read(); 
        } 
       } 
      } 
      } 

     private void button1_Click(object sender, EventArgs e) 
     { 
      if (tryLogin(user.Text, pass.Text) == true) 
      { 
       MainScreen F2 = new MainScreen(); 
       F2.Show(); 
       this.Hide(); 
      } 

      else MessageBox.Show("Wrong details!"); 
     } 
     } 



} 

ответ

0

кажется, что таблица Niki не имеет названий полей в качестве соли.

Следующий код возвращает NULL в переменной salt.

salt = cmd.ExecuteScalar() as string; 

Итак, в следующем заявлении вы проверяете значение null или пустое значение соли.

if (string.IsNullOrEmpty(salt)) return false; 

и вы возвращаете ложь из кода, если соль пуста или null. Таким образом, функция tryLogin возвращает false, и вы видите окно нежелательных сообщений «Неправильные данные!».

Вы можете разместить окно сообщения для отображения значения соли, возвращенное из ExecuteScalar() для проверки

+0

Я не понимаю, что я должен был заменить? –

+0

Значение соли пустое/пустое для пользователя, вы передаете функцию tryLogin(). Если вы введете какое-то значение в таблицу для этого пользователя в поле солей. Тогда код будет отлично работать. –

+0

Я вставил данные: 12300 в поле солей в моей таблице niki, но все еще получаю ошибку. Есть идеи? –