2012-05-16 7 views
0

저는 C# 프로그래밍에 익숙하며 C# 및 MySQL 데이터베이스를 사용하여 WPF에서 로그인 양식을 만들려고합니다. 내 WPF를 실행하고 나는이 줄에 오류가 발생하고 데이터를 삽입 할 때 :해싱 암호 알고리즘과 실제 프로그램 실행

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

오류는 연결이 유효하고 열려 있어야합니다. 문제가 될 수있는 단서가 있습니까?

얘들 아이 사람은 민감한 데이터 필드를 언리얼로 바꾸는 전체 코드입니다.하지만 나는 여전히 오류가 발생하고 있습니다. 문제가 어디에서 왔는지 확인할 수 있습니까? 당신이 생산 코드와

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")) 
        { 
         cmd.Parameters.AddWithValue("@username", username); 

         salt = cmd.ExecuteScalar() as string; 
        } 
enter code here 
enter code here 

:

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")) 
       { 
        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")) 
       { 
        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!"); 

     }   
     } 


} 

는 내가 업데이트 할 필요가 있음을 의미합니까? 그렇다면 실제로 MySQL 데이터베이스에 어떻게 연결합니까?

+0

당신은 SQL 명령 개체 당신에게 당신의 연결을 추가 할 필요가 C#에서 MySQL과 작업하는 방법에 대한 정보의 비트에 대한 http://zetcode.com/db/mysqlcsharptutorial/

:에서

봐. ....... "text", con); – tsells

답변

1

글쎄, 데이터베이스를 읽거나 쓰려고 시도하기 전에 연결을 연 다음 명령을 실행해야합니다.

using (MySqlConnection cn = GetConnection()) 
{ 
    cn.Open(); 
    // create the command and link it to the connection 
    using (var cmd = new MySqlCommand("Select salt From niki where user_name = @username", cn)) 
    { 
     cmd.Parameters.AddWithValue("@username", username); 
     salt = cmd.ExecuteScalar() as string; 
    } 
} 

public MySqlConnection GetConnection() 
{ 
    MySqlConnection cn = new MySqlConnection("Server=myServerAddress;Database=myDataBase;Uid=myUsername;Pwd=myPassword;"); 
    return cn; 
} 

편집 : 퍼즐의 누락 된 부분은 여기에 있습니다 :

MySqlCommand cmd = MySqlCommand("your_query_text", cn)

+0

제발 내 편집 게시물을 확인 할 수 –

+0

만약 당신이 내 대답을 신중하게 보면, 그 명령을 만들 때, 나는 연결을 추가 볼 수 있습니다. 따라서 명령이 실행되면 사용할 연결을 알게됩니다. 샘플에서이 연관성은 절대 수행되지 않으므로 오류가 발생합니다. – Steve

0

당신이 연결을 가지고있다? 당신이 연결을 사용하지 않는 업데이트 된 게시물

 using (MySqlConnection connection = new MySqlConnection(connectionString)) 
     { 
      connection.Open(); 
      using (MySqlCommand command = new MySqlCommand("Select salt From niki where user_name = @username", connection)) 
      { 
       command.CommandType = CommandType.Text; 
       command.Parameters.AddWithValue("@username", username); 
       salt = cmd.ExecuteScalar() as string; 
      }     
     } 

편집 뭔가를하려고하면 MySqlCommand의 생성자에서

command.Connection = connection; 

같은

using (MySqlCommand command = new MySqlCommand(Command, Connection)) 
{ 
} 

또는 다른 뭔가가 필요 편집 2 데이터베이스 코드를 아래 코드로 바꾸면 여전히 문제가 있습니까? ?

   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(); 
        } 
       } 
      } 
+0

제발 내 편집 된 게시물을 확인하십시오 –

+0

@NikolayDyankov 내 대답 업데이트 – Manatherin

+0

내 편집 된 게시물을 확인하십시오. –

0

여기에는 몇 가지 문제가 있습니다.

첫 번째는 연결을 설정하는 데 필요한 MySqlConnection 개체를 실제로 인스턴스화하지 않는 것입니다.

관련 문제