2011-11-24 200 views
0

我想創建一個基本的WPF應用程序,它可以在SQL Server 2008中存儲加密的密碼,並且在用戶嘗試登錄時也檢索回密碼,但我收到錯誤下面這篇文章'插入SQL Server 2008時'字符串或二進制數據被截斷'

http://www.dreamincode.net/forums/topic/123865-one-way-encryption/

我讀通彩虹攻擊和鹽和散列後..

我嘗試了一些代碼,但得到一個錯誤

我的錯誤得到的是

字符串或二進制數據將被截斷

我讀這篇文章,並試圖將textbox.text轉換爲字符串,並試圖在密碼輸入texbox只有一個字母,但仍然不工作(「我改變了CONNSTRING出於安全原因的CONNSTRING工作並沒有問題與」)

private void button1_Click(object sender, RoutedEventArgs e) 
{ 
     string strPassword; 
     SqlConnection cs= new SqlConnection("Data Source=STEVEJOBS;Initial Catalog=Test database;Integrated Security=True"); 
     SqlDataAdapter da = new SqlDataAdapter(); 
     da.InsertCommand = new SqlCommand("INSERT INTO Member_info(Name,Username,Password,Email,Member) VALUES(@Name,@Username,@Password,@Email,@Member)", cs); 
     da.InsertCommand.Parameters.Add("@Name", SqlDbType.NVarChar).Value = Name_tb.Text; 
     da.InsertCommand.Parameters.Add("@Email", SqlDbType.VarChar).Value = Email_tb.Text; 
     da.InsertCommand.Parameters.Add("@Username", SqlDbType.VarChar).Value = Username_tb.Text; 

     //MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider(); 
     //byte[] hashedBytes; 
     //UTF8Encoding encoder = new UTF8Encoding(); 
     //hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(strPassword)); 
     //SqlParameter paramPwd; 
     //paramPwd = new SqlParameter("@Password", SqlDbType.Binary, 16); 
     //paramPwd.Value = hashedBytes; 
     //da.InsertCommand.Parameters.Add(paramPwd); 

     da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = HashPassword(Password_tb.Text.ToString()); 
     da.InsertCommand.Parameters.Add("@Member", SqlDbType.NText).Value =Myes_rb.Content ; 

     cs.Open(); 

     da.InsertCommand.ExecuteNonQuery(); 

     cs.Close(); 
     MessageBox.Show("Sucessfully added"); 
    } 

    static string HashPassword(string pasword) 
{ 
      byte[] arrbyte = new byte[pasword.Length]; 
      SHA256 hash = new SHA256CryptoServiceProvider(); 
      arrbyte = hash.ComputeHash(Encoding.UTF8.GetBytes(pasword)); 
      return Convert.ToBase64String(arrbyte); 
    } 

THKS的幫助!

+0

另外,就像注意 - 如果你使用單向密碼,沒有任何奇怪的方式來解碼它們,所以你已經失敗了。即使修復了世界上所有的錯誤,也不會讓你檢索到密碼。使用SHA很容易就可以獲得諾貝爾數學的價格。 – TomTom

+0

我敢打賭我的祕密SHA256.unhash(),它是引發此錯誤的密碼列,Base64每2個輸入字節使用3個字符。 –

+0

認爲OP想要檢索散列密碼並將其與散列用戶輸入進行比較,而不是從數據庫的散列值中獲取原始密碼。 –

回答

3

當您嘗試插入字符數多於列定義中指定的字符時,會出現此錯誤。讓你的字符串列更寬。

要標識觸發此錯誤的列,您可以逐個刪除參數(刪除該列的da.InsertCommand.Parameters.Add行,並在INSERT語句的VALUES部分中放入一個常量,如'John')來更改INSERT語句。

編輯#1:

繼續消除列一個接一個(就像你一樣,密碼欄),一旦插入語句不失敗,你會知道什麼樣的列造成的錯誤。然後調試以找出您分配的值的長度(失敗)列參數。數據庫中該列的長度必須大於值的長度您試圖插入。

另一件需要注意的事情:在寫你的問題的時候,你認爲密碼列是問題,但也許其他一些列是問題。 只有解決此錯誤的方法是使所有列足夠寬,以便可以將值存儲在其中

編輯#2:

使用Password屬性來獲取文本用戶鍵入:

da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = 
     HashPassword(Password_tb.Password); 

要獲得哈希密碼的長度,使用此代碼來代替:

string pwdHash = HashPassword(Password_tb.Password); 
    da.InsertCommand.Parameters.Add("@Password", SqlDbType.VarChar).Value = pwdHash; 

認沽斷點在第二行,並檢查pwdHash字符串的長度。數據庫表中的密碼列必須等於或大於此長度。

+0

確定基本上根據你說的話改變了下面的句子da.InsertCommand = new SqlCommand(「INSERT INTO Member_info(Name,Username,Password,Email,Member)VALUES(@ Name,@ Username,'jhon',@ Email, @Member)「,cs);並註釋掉了//da.InsertCommand.Parameters.Add(「@Password」,SqlDbType.VarChar).Value; = HashPassword(Password_tb.ToString());你想說什麼? – JackyBoi

+0

你說得對,我的陳述在回答中是不完整的,我會馬上添加它。 –

+0

嗨,我嗨,我遵循了你的建議,並將所有的列改爲普通值..但是當我這樣做沒有問題..當我扭轉回來我的意思是把@密碼回我得到一個錯誤..問題是我如你所見,在WPF中創建這條線它已經是一個密碼輸入..所以沒有'password.text'這樣的東西..那麼該怎麼辦? – JackyBoi

0

好吧,你完全沒有。 YOu很多問題。讓我們開始:

我想創建一個可以在SQL SERVER 2008存儲加密的密碼,也找回取回密碼基本的WPF應用程序,當用戶嘗試的登錄,但我收到後 錯誤關注此文章http://www.dreamincode.net/forums/topic/123865-one-way- 加密/

失敗,已解僱。請參閱 - 單向哈希(不加密)被稱爲是因爲它是一種方式。沒有辦法在沒有打破它的情況下檢索密碼。程序將無法工作。

也試圖在密碼輸入texbox只有一個字母,但仍然不列入工作

閱讀文檔如何醃製的作品。 SHA將輸入轉換爲特定長度的二進制隨機數。無論您是否提供1或1000個字符長的密碼都是完全不相關的,結果將始終是固定的二進制代碼。

return Convert.ToBase64String(arrbyte);

這是非常不規則的。大多數人會將數組轉換爲HEX(固定長度,易於讀取/寫入以進行調試)並使用它。

無論如何,寫出你在這裏返回的字符串的長度。根據表結構長度查找所有參數。成品。

而且你仍然沒有完成作業 - SHA不能不中斷地取回。

可以在SQL Server 2008中存儲加密口令,也 檢索回當用戶嘗試的登錄

永遠不會使用這種方法來實現密碼

基本WPF應用程序。

+0

哇!那非常詳細,tks DONAL TRUMP!哈哈,我被解僱了!所以,任何文章,我可以閱讀並通過您的詳細報告閱讀後得到正確的解決方案..我希望你有..casue我beatup找到一個! – JackyBoi

+0

當然。閱讀有關加密選項的信息 - 並遠離所謂的「單向」合成,而不是說當你需要兩種方式時這意味着什麼。 – TomTom

+3

@TomTom,OP想要檢索散列密碼並將其與散列用戶輸入進行比較,而不是將數據庫中的散列值轉換回原始的純文本密碼。 –

相關問題