2014-11-24 128 views
1

所以我散列密碼使用Rcfc2898DeriveBytes類.NET貯藏PBKDF2迭代

一切數據庫爲散列做工精細和存儲這兩個最終散列和鹽。

但是,我在計算散列密碼時存儲類運行的迭代次數時遇到問題。

谷歌搜索後,我只看到它應該存儲在密碼哈希前面,但我不確定如何去使用這種方式,這將使數字可檢索的情況下,以便我以後更改數字(在不存儲迭代的情況下,更改會破壞舊密碼)。

我看到bcrypt會爲你做這一切,但我沒有向項目中添加庫的奢望。

什麼是最好的方式來存儲這個數字,我將如何去做這樣做,所以它是可檢索的,不僅在丟失散列時存儲(我將它從哈希中分離出來,一旦我拿回來)?

感謝您提供任何建議和信息!

回答

1

我在下面的URL找到了我要找的東西。

https://cmatskas.com/-net-password-hashing-using-pbkdf2/

相關代碼在這裏:

public class PasswordHash 
{ 
    public const int SALT_BYTE_SIZE = 24; 
    public const int HASH_BYTE_SIZE = 20; 
    public const int PBKDF2_ITERATIONS = 1000; 
    public const int ITERATION_INDEX = 0; 
    public const int SALT_INDEX = 1; 
    public const int PBKDF2_INDEX = 2; 

    public static string HashPassword(string password) 
    { 
     var cryptoProvider = new RNGCryptoServiceProvider(); 
     byte[] salt = new byte[SALT_BYTE_SIZE]; 
     cryptoProvider.GetBytes(salt); 

     var hash = PBKDF2(password, salt, PBKDF2_ITERATIONS, HASH_BYTE_SIZE); 
     return PBKDF2_ITERATIONS + ":" + 
       Convert.ToBase64String(salt) + ":" + 
       Convert.ToBase64String(hash); 
    } 

    public static bool ValidatePassword(string password, string correctHash) 
    { 
     char[] delimiter = { ':' }; 
     var split = correctHash.Split(delimiter); 
     var iterations = Int32.Parse(split[ITERATION_INDEX]); 
     var salt = Convert.FromBase64String(split[SALT_INDEX]); 
     var hash = Convert.FromBase64String(split[PBKDF2_INDEX]); 

     var testHash = PBKDF2(password, salt, iterations, hash.Length); 
     return SlowEquals(hash, testHash); 
    } 
} 

我把HashPassword方法來我的值保存到數據庫中供以後使用。我使用ValidatePassword讓他們返回給我再次使用。它像一個魅力一樣工作,並允許我根據所需的強度將salt和hash的字節大小以及迭代次數變化。這些值只存儲在Web/App配置文件中。

謝謝大家的回答!

0

原則,你根本不需要存儲迭代的數量。就像你不必存儲散列類型,如果你保持一致。

我會提出一些稍微不同的東西:存儲一個單字節(前綴),其中包含版本號,從零開始,在鹽&散列之前。此版本號與迭代次數,散列方法,字符編碼方法以及當然PBKDF2相關聯。如果您想升級到更好的協議,只需將01作爲初始字節存儲並將其與新參數關聯。這樣您就可以區分舊式的密碼和新的樣式。

通常情況下,只有當用戶輸入密碼作爲散列不可逆時才能升級,因此不容易升級迭代次數。

+0

當您想要升級尚未登錄的用戶時,您始終可以鏈接兩種哈希方法。我認爲僅在登錄時進行升級是一個壞主意(除非您定期刪除不活動的帳戶)。 – CodesInChaos 2014-11-25 10:22:37