2017-07-10 76 views
0

我已經在這裏擱置了好幾個小時了。我一直在嘗試創建一個登錄表單來開發一個簡單的應用程序。c#驗證存儲在SQL數據庫中的散列密碼

我已經成功設法對salt/hash密碼進行加密和創建用戶帳戶,登錄,散列和salt都使用INSERT查詢存儲在SQL數據庫表的不同列中。

我現在需要做的是在登錄頁面輸入來自用戶的密碼,並將其與存儲的鹽值相結合,重組合並的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"); 
       } 


      } 
     } 

我不知道如何使這個成功發生。我如何獲取存儲密碼salt的SQL列的值,然後將其添加到來自文本框(pwTXT.Text +存儲的pw鹽)的用戶密碼輸入中,以便我可以通過我的散列算法把結果,然後比較值來驗證用戶?

編輯:感謝弗拉德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

究竟是什麼不明顯?你已經很準確地描述了算法。你有從數據庫讀取的問題?將閱讀結果與文本框結合起來有問題嗎? –

+0

嘿謝謝你的迴應,我的問題是,我無法弄清楚如何從數據庫中獲取鹽的價值,並將它與文本框中的輸入相結合,就像你提到的那樣。我知道我需要用算法實現的過程,但實際上從數據庫中提取數據對我來說很麻煩。關於我需要做什麼來實現這一點的任何建議? – 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())) salt = reader [0]; } 我代替: 如果(dr.Read()){ 鹽 = dr.GetString(0) } 你肯定把我在正確的軌道上,雖然,我現在已經有散列函數和登錄工作完全與您的幫助。非常感謝你! – lostintranslation

+0

很高興幫助您,請將答案標記爲已接受,以表明問題已解決。 –

2

GenHash()函數正在傳遞字符串「@salt」而不是實際的鹽。

您需要將您的實現更改爲首先查詢salt,然後計算散列,然後再查詢一次以將計算出的散列與存儲的散列進行比較。

對於給出相同輸出的散列,密碼和鹽必須相同。作爲一個方面說明,您可能應該使用PBKDF2或Bcrypt,而不是像SHA或MD5這樣的簡單哈希。

+0

嗨,謝謝你的迴應,我知道字符串@Salt是錯誤的,這是我最後努力的一部分(不成功)。 我試圖拉第一個查詢鹽的價值,但我不確定如何實現這一點。這是通過使用Sqldatareader完成的嗎?什麼是需要得到鹽的查詢,所以我可以用它來計算散列? – lostintranslation

相關問題