我一直在閱讀有關數據庫(https://crackstation.net/hashing-security.htm)確保用戶的密碼。基本的想法是理解的 - 生成一個隨機的Salt,將其附加到密碼並散列密碼。保護用戶的密碼 - Rfc2898DeriveBytes VS SHA512
所以這裏就是我所做的(我沒有把這裏一些方法做轉換爲字符串):
RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create();
byte[] rndBytes = new byte[512];
randomNumberGenerator.GetBytes(rndBytes);
string salt = ToHexString(rndBytes);
var sha512Hasher = SHA512.Create();
string hashedPwd = ToHexString(sha512Hasher.ComputeHash(GetBytes(pwd + salt)))
根據這篇文章,這是保證,但可以更使用安全「鍵伸縮「這對我的理解是哈希做得比較慢(使用參數)使密碼變得更難。
因此,這裏是我所做的:
RandomNumberGenerator randomNumberGenerator = RandomNumberGenerator.Create();
byte[] salt = new byte[512];
randomNumberGenerator.GetBytes(salt);
Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(user.Password, salt, 1000);
byte[] hashBytes = k1.GetBytes(512);
string hash = ToHexString(hashBytes);
現在,這裏是我的問題:
- 是什麼
SHA512
和Rfc2898DeriveBytes
之間的區別?哪個更安全? - 我應該用更少的鹽和更多的迭代?它會使它更安全嗎?
- 在它運行速度非常快1000次迭代 - 多慢應該是什麼?半秒鐘?一秒?這裏的經驗法則是什麼?
- 在數據庫 - 我應該字節數組轉換爲字符串和存儲字符串或者我應該存儲在一個二進制數據字段中的字節數組?
編輯(另一個問題)
- 如果我遍歷換湯不換藥SHA512 1000次 - 它給予同樣的安全性?
那麼根據你所說的第二個例子 - 使用Rfc2898DeriveBytes生成鹽和迭代比第一個例子更安全嗎? – developer82
@ developer82 - 正確,存儲密碼更安全。 – martinstoeckli
我會在這裏添加一個關於大於底層散列函數的密鑰延伸的評論。 OP的PBKDF2代碼的長度爲** 1KB **,遠遠大於它應該得到的結果。 –