2016-07-22 39 views
4

我的任務是編寫一種計算密碼哈希的新方法,以取代我們感覺不夠安全的舊方法。很久以前,我讀了Security Driven .NET這本書,其中我瞭解到重要的部分是使用具有可配置的轉數(而不是簡單的哈希)的算法,並且在.NET中推薦的算法是稱爲PBKDF2用於密碼處理。我還認爲,作爲對ASP.NET如何處理密碼的一種改進,如果通過使用PBKDF2創建主數據庫的方式將存儲在數據庫中的結果哈希與用戶(名稱或ID)加密綁定在一起鍵,然後使用用戶名(或ID)使用HKDF創建派生密鑰。但是,再次,這是我從一本我目前無法訪問的書中讀到的表面知識,所以如果我的記憶是正確的,我不能重新檢查。在.NET中使用PBKDF2和HKDF進行密碼哈希處理

此外,我以前沒有使用.NET DerivedBytes API,所以我可能會做錯。所以我的問題是這樣的:我在下面的代碼中正確地做事情嗎?我是否正確使用API​​?這個實現是否「足夠安全」?或者我做錯了什麼,它完全消除了所有的安全性?

protected override byte[] ComputeHash(string user, string salt, string password) 
{ 
    var userBytes = user.ToBytes(); 
​ 
    using (var pbkdf2 = new PBKDF2(MacFactories.HMACSHA512, password.ToBytes(), salt.ToBytes())) 
    { 
     var masterKey = pbkdf2.GetBytes(128); 
     using (var hkdf = new HKDF(MacFactories.HMACSHA512, masterKey, userBytes, userBytes)) 
     { 
      return hkdf.GetBytes(64); 
     } 
    } 
} 

回答

4

你有正確的思路/辦法 - 這裏是一個稍微好一點的實現:

byte[] ComputeHash(string user, string salt, string password) 
{ 
    using (var pbkdf2 = new PBKDF2(HMACFactories.HMACSHA512, password, salt.ToBytes())) 
    using (var hkdf = new HKDF(HMACFactories.HMACSHA512, pbkdf2.GetBytes(64), user.ToBytes())) 
     return hkdf.GetBytes(64); 
} 

你不應該問pbkdf2比底層PRF的字節長度多字節(你的情況,產生64字節的SHA512)。

您可以將hkdf上下文作爲null,因爲您似乎並不需要它。

對於其他誰可能想知道上面的代碼使用什麼庫 - Inferno crypto