2017-07-10 8 views
0

私はこれでかなりの時間がかかりました。私は開発しているシンプルなアプリケーションにログインフォームを作成することを試しています。c#SQLデータベースに格納されているハッシュされたパスワードを検証しています

私はパスワードのsalt/hashを成功裏に管理しました。ユーザーアカウントを作成すると、ログイン、ハッシュ、ソルトはINSERTクエリを使用してSQLデータベーステーブルの別々の列に格納されます。

私が今必要とするのは、ログインページでユーザーからのパスワード入力を受け取り、保存されたsalt値と組み合わせ、結合されたpw + saltを再ハッシュし、保存されたハッシュ値と比較してユーザーを検証します。私はこれを達成しようとするSELECTクエリを使用していますが、これまでのところ成功していません。私はこれが正常に実現する方法がわからないんだけど

///Gather the data from the SQL db, find the username, hash and salt values 
     string ds = @"Data Source"; 
     using (SqlConnection con = new SqlConnection(ds)) 
     { 

///define a set of strings for the query, the login textbox, password textbox and the Hash Gen Algorithm 
      string query = "SELECT Login, Hash, Salt FROM [Table] WHERE ([email protected], [email protected], [email protected])"; 
      string uname = logTXT.Text; 
      string passw = pwTXT.Text; 
      string hash = GenHash(passw, "@salt"); 

      using (SqlCommand cmd = new SqlCommand(query, con)) 
      { 
       con.Open(); 

       cmd.Parameters.AddWithValue("@Login", uname); 
       cmd.Parameters.AddWithValue("@Hash", hash); 

       cmd.Connection = con; 
       SqlDataReader dr = cmd.ExecuteReader(); 

       if("@Hash" == hash) 
       { 
        MessageBox.Show("Login Successful"); 
       } 
       else 
       { 
        MessageBox.Show("Login Failed"); 
       } 


      } 
     } 

は、ここに私のコードです。

私の質問は次のとおりです。パスワード塩を格納するSQL列の値を取得し、それをテキストボックス(pwTXT.Text + stored pw salt)からのユーザーパスワード入力に追加するには、その結果を私のハッシュアルゴリズムに入れて、値を比較してユーザーを検証しますか?

編集:Vlad Stryapkoのおかげで、少し修正されたバージョンを使用して動作させることができ、ハッシュアルゴリズムが正常に実装され、すべて正常に動作しています。 正しい/最も役に立つ答えが彼に行くべきです。

string ds = @"Data Source"; 
using (SqlConnection con = new SqlConnection(ds)) 
{ 
string query = "SELECT Salt FROM [Table] WHERE ([email protected])"; 
string uname = logTXT.Text;    

using (SqlCommand cmd = new SqlCommand(query, con)) 
{ 
    con.Open();  
    cmd.Parameters.AddWithValue("@Login", uname); 
    SqlDataReader dr = cmd.ExecuteReader(); 
    string salt = null; 
    if (dr.Read()) 
    { 
     salt = dr.GetString(0); 
    }  
} 
+0

正確には何が分かりませんか?あなたはアルゴリズムをかなり正確に記述しました。あなたはDBからの読書に問題がありますか?読んだ結果とテキストボックスを組み合わせる際に問題がありますか? –

+0

お返事ありがとう、私の問題は、DBから保存された塩の値を取得する方法と、これをテキストボックスの入力と組み合わせることができないということです。私はアルゴリズムで達成するために必要なプロセスを知っていますが、実際にはデータベースからデータを引き出すことは私には面倒です。これを達成するために私が何をする必要があるかに関する提案はありますか? – lostintranslation

+0

私の答えが役立つかどうか確認してください。 –

答えて

0

はあなたの現在のコードに基づいて、塩を得ることができる方法は次のとおりです。

string ds = @"Data Source"; 
using (SqlConnection con = new SqlConnection(ds)) 
{ 
    string query = "SELECT Salt FROM [Table] WHERE ([email protected])"; 
    string uname = logTXT.Text;    

    using (SqlCommand cmd = new SqlCommand(query, con)) 
    { 
     con.Open();  
     cmd.Parameters.AddWithValue("@Login", uname); 
     SqlDataReader dr = cmd.ExecuteReader(); 
     string salt = null; 
     if (reader.Read()) 
     { 
      salt = reader[0]; 
     }  
    } 
} 

その後、あなたのハッシュ関数に渡す塩を使用することができますに。

+0

はあなたにヴラドをありがとう、これを実装し、それはあなたが持っていた私は を変更する一つの部分以外にも完璧に働いている:(reader.Read())){ 塩=読者ならば[0] 。 } 私が代わりに使用:(dr.Read()) { 塩= dr.GetString場合は、間違いなく、しかし右のトラックに私を入れて、私は今すでにハッシュ関数を持っている (0) } をし、あなたの助けを借りて完全にログインしてください。とてもありがとう! – lostintranslation

+0

問題が解決したことを示すために回答を受け入れ済みとマークしてください。 –

2

実際の塩ではなく、GenHash()関数に文字列 "@salt"が渡されています。

最初にsaltをクエリするように実装を変更し、ハッシュを計算してから、もう一度クエリを実行して、計算されたハッシュと格納されたハッシュを比較する必要があります。

同じ出力を与えるためのハッシュでは、パスワードと塩は同じでなければなりません。

SHAまたはMD5のような単純なハッシュではなく、PBKDF2またはBcryptを使用することをお勧めします。ここで

+0

こんにちは、応答をありがとう、私は文字列@ Saltが間違っていたことを知っていた、それは(失敗した)それを働かせるために私の最後の努力の一部だった。 私は最初のクエリで塩の価値を引き出そうとしていますが、これを達成する方法がわかりません。これはSqldatareaderを使って行われますか?私はそれを使用してハッシュを計算することができるように、塩を得るために必要なクエリは何ですか? – lostintranslation

関連する問題