2010-07-28 2 views
4

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

Например, пользователь будет использовать пароль:

"secret" 

Мой код будет генерировать значение соли:

"d1d0e3d4b3d1ed1598a4e77bb614750a2a175e" 

Затем хэш результат, чтобы получить:

"e8187dcbe8e2eabd4675f3a345fe21c98affb 
5544a9278461535cb67265b6fe09a11dbef572 
ce3a4a8f2275839927625cf0bc7bc46fc45d51 
12d7c0713bb4a3" 

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

Любые мысли? Как я уже сказал, это проверка здравого смысла по поводу моей идеи.

+0

Как образуется соль? – kennytm

+1

Зачем вам это нужно? Какова цель повторного хеширования? Если это «больше безопасности», то какая слабость вы пытаетесь исправить в отсутствие повторного хэширования? Кстати, я предполагаю, что это просто эксперименты; если вы «новичок в хэшировании и шифровании», тогда вы не должны писать код безопасности производства. –

+3

@Adam: Безопасность может быть очень трудно сделать правильно. В производственном коде правильный ход почти всегда основывается на методах, которые, как полагают, защищены защищенным сторонним кодом. –

ответ

6

Хранение уникальной соли на пользователя - хорошая идея, на мой взгляд. Повторное генерирование комбинации соль/хэш каждый раз, когда пользователь входит в систему, является немного бессмысленным, если у вас нет циклов процессора для записи.Я бы рекомендовал использовать что-то вроде Rfc2898DeriveBytes класса для создания безопасной соли/хэш-комбо:

Простой пример создания хэш от пароля:

string password = GetPasswordFromInput(); 

using (var deriveBytes = new Rfc2898DeriveBytes(password, 32)) // 32-byte salt 
{ 
    byte[] salt = deriveBytes.Salt; 
    byte[] hash = deriveBytes.GetBytes(32); // 32-byte hash 
    SaveToDatabase(salt, hash); 
} 

И соответствующей проверки пароля:

string password = GetPasswordFromInput(); 
byte[] salt = GetSaltFromDatabase(); 
byte[] hash = GetHashFromDatabase(); 

using (var deriveBytes = new Rfc2898DeriveBytes(password, salt)) 
{ 
    if (deriveBytes.GetBytes(32).SequenceEqual(hash)) 
     Console.WriteLine("Password matches"); 
    else 
     throw new Exception("Bad password"); 
} 
+0

Незначительный приговор: наличие циклов процессора для записи не изменяет бессмысленности. :) –

+0

Очень классный материал. –

4

Как уже упоминалось, хеширование и хранение пароля каждый раз, когда пользователь входит в систему, не имеет реальной цели.

Вместо того, чтобы кататься самостоятельно, вам может понадобиться использовать BCrypt.NET, .NET-версию проверенного алгоритма хэширования пароля.

Использование очень просто:

// When setting password 
string hashedPassword = BCrypt.HashPassword(password, BCrypt.GenerateSalt()); 

// Upon login 
bool validPassword = BCrypt.CheckPassword(password, hashedPassword); 

Это позволяет варьировать вычислительные затраты на вычисление хэш пароля, если вы хотите, что делает его более трудным для кого-то, чтобы сделать словарную атаку на базу данных, они могли бы получили, например. Это делается путем добавления параметра к вызову метода GenerateSalt.

Подробная информация о алгоритме BCrypt can be found here.

+0

Является ли эта соль автоматически сохраняющейся или нужно ее сохранить? –

+0

@Adam: Он только делает хэширование и проверку. Вы можете хранить хешированное значение где угодно, но соль, соль и хэш упакованы в одну строку. Это отличается от существующего (?) Решения, где они представляют собой два отдельных значения. – Thorarin

+0

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

1

Настоящая цель соли заключается в предотвращении предвычисляющих атак, поскольку сама соль НЕ должна быть секретной (т. Е. Хорошо, чтобы она была доступна из внешнего мира). Поэтому он не предназначен для обеспечения защиты от грубой форсировки, поскольку он (почти) так же легко хеш (Salt + Password), что и hash (Пароль).

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

+0

В приведенной статье говорится: «В некоторых протоколах соль передается в виде открытого текста с зашифрованными данными» - не противоречит ли это тому, что он не является общедоступным? – Hut8

+2

@Adam: Использование соли - защита хэша паролей от предварительно вычисленных радужных таблиц, а не вторичный пароль. Для общественной соли, вы должны вычислить каждый возможный пароль с солью, что намного больше, чем получение таблицы из другого места и выполнение простого поиска. Поскольку это применимо только в том случае, если злоумышленник получил хэши паролей, которые должны быть секретными, кажется бессмысленным предположить, что соль будет храниться в секрете. –

3
  • Каждый пользователь должен иметь свою уникальную соль.
  • Нет смысла обновлять соль каждый раз, когда пользователь входит в систему, это не имеет реальной цели в отношении безопасности.
  • Соль должна быть случайным образом сгенерирована и никак не связана с паролем.

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

Использование соленого хеша не защищает от атаки словаря грубой силы. Вам нужно будет использовать другие методы для защиты от них.

Смежные вопросы