您能否告诉我以下是否是安全地散列密码以存储在数据库中的好方法:
public string CreateStrongHash(string textToHash) {
byte[] salt =System.Text.Encoding.ASCII.GetBytes("TeStSaLt");
Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(textToHash, salt, 1000);
var encryptor = SHA512.Create();
var hash = encryptor.ComputeHash(k1.GetBytes(16));
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hash.Length; i++) {
sb.Append(hash[i].ToString("x2"));
}
return sb.ToString();
}
提前谢谢了。
您使用 PBKDF2-SHA1,它还不错,但不是很好。 Bcrypt 好一点,scrypt 更强一些。但由于 .net 已经包含内置的 PBKDF2 实现,因此这是一个可以接受的选择。
你最大的错误是你没有明白盐的意义。盐对于每个用户来说应该是唯一的。标准做法是简单地创建一个至少 64 位的随机值。将其与哈希值一起存储在数据库中。
如果你愿意,你可以将盐分成两部分。一份与用户一起存储在数据库中,每个用户都不同,一份共享部分存储在其他地方。这获得了两者的优点。
我还建议使用比1000
。弄清楚什么样的性能是可以接受的,并进行相应的调整。我不会低于 10000,在某些情况下(磁盘加密)一百万也是可以接受的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)