我对安全性知之甚少(我需要找到基础知识的基本解释),并试图提出一种合理的方法来使用 .Net 将用户密码存储在数据库中。
这是我目前的解决方案:
private static byte[] HashPassword(string password)
{
using (var deriveBytes = new Rfc2898DeriveBytes(password, 10))
{
byte[] salt = deriveBytes.Salt;
byte[] key = deriveBytes.GetBytes(20);
return salt.Concat(key).ToArray(); //Return Salt+Key
}
}
我将 HashPassword() 的结果存储在数据库中。要检查用户的密码,我这样做:
var salt = //1st 10 bytes stored in the DB
var key = //Next 20 bytes stored in the DB
using (var deriveBytes = new Rfc2898DeriveBytes(password, salt))
{
byte[] newKey = deriveBytes.GetBytes(20);
if (newKey.SequenceEqual(key) == false) //Check if keys match
{
return "No Match";
}
else { return "Passwords match"; }
我的问题是盐是否需要像这样随机存储在数据库中,或者我是否可以生成一个 10 字节的盐并将其存储在我的代码中,并始终使用相同的盐来保存自己将盐存储在数据库中存储密钥?
此外,如果有人看到我正在做的任何其他问题,我将不胜感激任何建议。