Нужно ли соль быть случайным, чтобы защитить хэш пароля? - PullRequest
8 голосов
/ 08 февраля 2012

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

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

Ответы [ 2 ]

29 голосов
/ 08 февраля 2012

Мой вопрос заключается в том, должна ли соль быть случайной и сохраняться в БД, как это, или я могу сгенерировать 10-байтовую соль и сохранить ее в своем коде и всегда использовать ту же самую соль, чтобы сохранить себя, сохраняясоль в БД и просто хранить ключ?

АБСОЛЮТНО НЕ.

Вы вообще не понимаете назначение соли, если выдаже задавая этот вопрос.

Цель соли - произвольно усложнить для злоумышленника использование предварительно вычисленной таблицы хешированных общих паролей.Если соль всегда одна и та же, то злоумышленник просто вычисляет таблицу хэшированных общих паролей с этой солью.

Позвольте мне прояснить это.Предположим, что злоумышленник получил вашу базу данных паролей и в свободное время проводит атаку на все сохраненные хэши, чтобы выяснить, какой пароль соответствует хешу.Если каждая соль различна, то злоумышленник должен выполнить свежую атаку против каждой записи в базе данных.Если каждая соль одинакова, то атакующий одного пользователя атакует каждого пользователя .

Более того: предположим, что вы используете одну и ту же соль для каждого пользователя.Предположим, у двух пользователей один и тот же пароль.И предположим, что злоумышленник получил базу паролей. Злоумышленник теперь знает, какие два пользователя имеют один и тот же пароль , поскольку они имеют одинаковый соленый хеш, и может сделать разумное предположение, что это самый слабый пароль в базе данных .Злоумышленник может сосредоточить свои усилия (какими бы они ни были) на атаке этого пользователя в частности.И как только она узнает пароль этого пользователя, велика вероятность, что пользователь использовал это имя пользователя и слабый пароль в других системах, которые злоумышленник может теперь скомпрометировать , не имея своих файлов паролей.

Хорошо, что вы хотите узнать о безопасности;плохо, что вы пытаетесь написать настоящую систему паролей с вашим уровнем понимания.Если это для реальной системы, которая должна защищать реальных пользователей, используйте систему, созданную экспертами , или нанимайте своего собственного эксперта .Вы создадите систему, которую вы не сможете сломать, а не систему, которую атакующий не сможет сломать.

Более того: youпросят незнакомцев в интернете о помощи по безопасности .Незнакомцы, о которых вы не знаете, знают ли они, о чем говорят, или просто придумывают. Получить настоящего эксперта по безопасности (а это не я - я эксперт по семантическим анализаторам).Построение системы безопасности является одной из самых сложных задач программирования.Вам нужна профессиональная помощь.

Подробное введение в основные схемы аутентификации по паролю см. в моей серии статей:

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

1 голос
/ 08 февраля 2012

Вам не нужно применять случайную соль, но если вы сделаете это, ваши пароли будут более безопасными. Очевидно, что если вы примените случайную соль, то вам нужно сохранить ее с хешированным паролем в БД, чтобы вы могли сверять с предоставленным паролем.

Быстрый Google обнаружил этот пост , который может помочь вам.

...