2012-12-11 51 views
0

我有密碼加密問題。 我想要加密的密碼就像圖片中未突出顯示的那樣。SHA1加密問題

我寫了下面的C#代碼:

CAST(hashbytes('SHA1',@newuserpassword) as nvarchar)

 SHA1CryptoServiceProvider x = new SHA1CryptoServiceProvider(); 

     //byte[] bs = System.Text.Encoding.Unicode.GetBytes(password); 
     //byte[] bs = System.Text.Encoding.UTF32.GetBytes(password); 
     byte[] bs = System.Text.Encoding.UTF8.GetBytes(password); 
     bs = x.ComputeHash(bs); 
     var s = new StringBuilder(); 
     foreach (byte b in bs) 
     { 
      s.Append(b.ToString("x2").ToLower()); 
     } 

     new UserService().ChangeUserPassword(username, s.ToString()); 

我使用,我想刪除下面的SQL代碼加密以正確的方式密碼這是結果: enter image description here

+3

以字符存儲二進制數據是不安全的。你會遇到隨機數據丟失和怪異的錯誤。 – usr

回答

2

望着文檔爲CONVERT,我懷疑你只是想:

CONVERT(nvarchar, hashbytes('SHA1',@newuserpassword), 2) 

其中2是沒有轉換0x開頭爲十六進制的風格。我建議你指定nvarchar的長度,但應該是40(20字節,每字節2個字符)。

+0

tnx但我需要在c#中有相同的結果。我的意思是我想在我的數據庫中使用中文字符的密碼 –

+2

@SalvatoreDiFazio:你真的沒有。該輸出只是*破碎*。它試圖以不恰當的方式將任意二進制數據表示爲文本。 **不要這樣做。**使用十六進制或base64。如果您目前以這種格式存儲數據,則應該認爲它是垃圾。 –

+0

我想可以挽救足夠的數據,以便可以以足夠高的準確性執行密碼驗證。但OP應儘快放棄這一計劃。 – usr

0

我強烈建議你放棄以字符存儲二進制數據。不過,如果你需要保持遺留原因,這裏是SQL語句的翻譯:

byte[] bytes = ...; //your binary data here 
var nastilyBrokenChars = 
    Enumerable.Range(0, bytes.Length/2) 
    .Select(i => (char)BitConverter.GetInt16(bytes, i * 2)) 
    .ToArray(); 
string nastilyBrokenString = new string(nastilyBrokenChars); 

就可以了,我餡2 bytes到每個char。這本身就是無損轉換。但我不會相信將這些數據存儲到SQL Server(並稍後進行比較)是無損的。