2012-01-17 68 views
1

我做了一個用戶註冊,我醃過用戶密碼並使用SHA256散列它。 以後,當用戶需要登錄到我的系統時,我需要將他的密碼進行鹽漬和散列,所以我: 1.從數據庫0123中恢復salt「string」2.將salt轉換爲字節 3.創建一個新的byte [] = [inputPassword.length + salt.length] 4.並散列。C#:比較密碼散列與用戶輸入不同的大小,當認證用戶

現在新的哈希比原始哈希短...(使用相同的散列函數)

給了這些信息,你怎麼看待這個問題可能是... 被存儲在我的數據庫鹽爲CHAR錯了,如果是的話我應該怎樣保存它?

注意:在字節級別上比較兩個散列。 注:所有的用戶信息都存儲在數據庫中的密碼和鹽爲CHAR

預先感謝您

+0

您可以向我們提供您的代碼嗎?也許一些例子,都是從你的代碼和存儲的數據庫值中生成的? – sisve 2012-01-17 07:18:41

+0

代碼太大,加上它在不同的機器上:(但... 似乎鹽從數據庫檢索時是相同的,但問題是當它轉換爲字節時,我使用'Encoding.Unicode.GetBytes(鹽);'似乎這使得一個問題......因爲蜇都看起來很好... 將鹽轉換成字節時提出的問題... – Amait 2012-01-18 11:00:09

回答

1

您可以生成鹽從一個GUID轉換成基64字符串,然後保存在數據庫中焦炭。我使用nvarchar來使用.NET字符串最大化我的選項。

然後你就可以實現這樣的事情產生的原始密碼散列,以及比較哈希當用戶登錄時:

public static byte[] GetHash(string password, string salt) 
    { 
     byte[] unhashedBytes = Encoding.Unicode.GetBytes(String.Concat(salt, password)); 

     SHA256Managed sha256 = new SHA256Managed(); 
     byte[] hashedBytes = sha256.ComputeHash(unhashedBytes); 

     return hashedBytes; 
    } 

    public static bool CompareHash(string attemptedPassword, byte[] hash, string salt) 
    { 
     string base64Hash = Convert.ToBase64String(hash); 
     string base64AttemptedHash = Convert.ToBase64String(GetHash(attemptedPassword, salt)); 

     return base64Hash == base64AttemptedHash; 
    } 
+0

非常多,我已經有了,非常感謝...但 我使用'sqlDataReader' ...並使用'.GetString'來檢索鹽和密碼..會造成任何類型的問題嗎? – Amait 2012-01-17 08:22:55

1

通常散列函數返回固定大小的哈希值,所以如果你告訴新的哈希更短我認爲問題可能在你的散列函數。

+0

有可能是我震驚了我的自我看到有區別......最後,一個字節[]的大小爲88(新),另一個是128(數據庫)... atm我正在實現湯姆的代碼..這與我的內容非常相似伊迪有..但會看到它是否有任何影響... 謝謝反正。 – Amait 2012-01-17 08:18:56

相關問題