Я очень мало знаю о безопасности (мне нужно найти базовое объяснение основ) и я пытаюсь найти разумный способ хранения паролей пользователей в базе данных с использованием .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-байтовую соль и сохранить ее в своем коде и всегда использовать то же самое. соль, чтобы сохранить соль в БД и просто сохранить ключ?
Также, если кто-нибудь увидит какие-либо другие проблемы с тем, что я делаю, я буду признателен за любой совет.