Соль должны быть случайными для защиты хэша пароля?

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

Также, если кто-нибудь увидит какие-либо другие проблемы с тем, что я делаю, я буду признателен за любой совет.

8
задан Gumbo 9 February 2012 в 09:11
поделиться