我正在創建一個小的C#WinForms應用程序,但在驗證/驗證散列密碼時遇到了問題。驗證散列密碼
當用戶被創建時,他們的密碼被散列並存儲在數據庫中。我不知道如何將輸入的密碼(當用戶登錄時)與數據庫中的散列密碼進行比較。
代碼來創建哈希低於:
private static string CreateHashedPassword(string username, string plainTextPassword)
{
byte[] salt;
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);
System.Security.Cryptography.Rfc2898DeriveBytes pbkdf2 = new System.Security.Cryptography.Rfc2898DeriveBytes(plainTextPassword, salt, 3000);
byte[] hash = pbkdf2.GetBytes(20);
byte[] hashBytes = new byte[36];
Array.Copy(salt, 0, hashBytes, 0, 16);
Array.Copy(hash, 0, hashBytes, 16, 20);
return Convert.ToBase64String(hashBytes);
}
當用戶試圖登錄,我再次調用此方法來獲取哈希密碼進行比較的數據庫,但它永遠不會匹配。
我敢肯定,這是因爲新的鹽是每個方法運行時創建的,所以我敢肯定的方式來解決它(但我不知道如何)是兩種:
保存在數據庫中的鹽或
使用類似的用戶名來創建鹽。這是首選的方法,但我不知道如何從預先確定的字符串(如用戶名)中派生鹽。
任何想法/指針?謝謝!
你在做從頭定製認證/授權或您使用的一些圖書館爲此目的? –
那麼你實施了哪一個,你遇到了什麼問題? –
下面是一個鏈接,以便我使用pbkdf2爲密碼散列/比較器創建完整解決方案:[使用Pbkdf2的完整密碼散列解決方案](https://stackoverflow.com/documentation/c%23/2774/哈希函數/ 15470 /完整密碼哈希解決方案使用pbkdf2#t = 20170611103527142945) – Igor