您能告诉我以下是否是安全地散列密码以存储在数据库中的好方法:
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();
}
Run Code Online (Sandbox Code Playgroud)
提前谢谢了.
你使用PBKDF2-SHA1,这是不错的但不是很好.Bcrypt好一点,scrypt更强.但由于.net已经内置了PBKDF2实现,这是一个可以接受的选择.
你最大的错误就是你没有得到盐.每个用户的盐应该是唯一的.简单地创建至少64位的随机值是标准做法.将它与哈希一起存储在数据库中.
如果您愿意,可以将盐分成两部分.一个与用户一起存储在数据库中,每个用户都不同,一个共享部分存储在别处.这获得了两者的优点.
我还建议使用更高的工作因子1000.找出可接受的性能,并进行相应调整.我不会低于10000,在某些情况下(磁盘加密)也可以接受一百万.
| 归档时间: |
|
| 查看次数: |
706 次 |
| 最近记录: |