Подтвердить что ты не робот

Улучшить хеширование паролей со случайной солью

Я запускаю веб-сайт, и я пытаюсь решить, как шифровать пароли пользователей для их хранения в базе данных SQL.

Я понимаю, что использование простого md5 (пароля) очень небезопасно. Я рассматриваю использование sha512 (password.salt), и я изучал лучший способ создания полезной соли. Я читал многочисленные статьи о том, что соль должна быть настолько случайной, насколько это возможно, чтобы добавить энтропию к хешу, и это выглядит как отличная идея. Но:

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

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

У кого-нибудь есть опыт в этой области? Спасибо!

4b9b3361

Ответ 1

Злоумышленнику "разрешено" знать соль - ваша безопасность должна быть спроектирована таким образом, чтобы даже с уверенностью в том, что соль по-прежнему безопасна.

Что делает соль?

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

ЕСЛИ вы хотите усилить безопасность дальше
Вы можете рассчитать хэш несколько раз (хеш-хэш и т.д.) - это вам не дорого, но делает более грубую атаку/расчет "радужных столов"... пожалуйста, не изобретайте себя - для этого существуют стандартные методы, см., например, http://en.wikipedia.org/wiki/PBKDF2 и http://www.itnewb.com/tutorial/Encrypting-Passwords-with-PHP-for-Storage-Using-the-RSA-PBKDF2-Standard p >

ПРИМЕЧАНИЕ.

Использование такого механизма в наши дни имеет мандат, так как "время процессора" (применимое для атак, таких как радужные таблицы/грубая сила и т.д.) становится все более доступным (см., например, тот факт, что сервис Amazon Cloud является одним из лучших 50 самых быстрых суперкомпьютеров по всему миру и могут быть использованы кем-либо за сравнительно небольшую сумму)!

Ответ 2

учитывая, что злоумышленник каким-то образом получил доступ к вашим хешированным паролям (и пытается изменить хэш на обычный текст), это означает, что он вероятно, сбросил вашу базу данных, а затем получил доступ к вашим случайным солям также

Весь смысл соления - победить "радужные столы":

http://en.wikipedia.org/wiki/Rainbow_table

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

как это безопаснее?

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

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

В настоящее время вы хотите сохранить свои "пароли", используя что-то вроде PBKDF2 или scrypt.

Ответ 3

Сильные ваши хешированные, соленые пароли полагаются на все следующие факторы:

  • Сила алгоритма хэширования
  • Случайность соли
  • Случайность пароля

Ваша система столь же сильна, как и самая слабая из вышеперечисленных.

Ответ 4

Ниже приведены вопросы с сайта-сестра Security StackExchange. Они обсуждают хеширование, соли, PBKDF2, bcrypt, scrypt и некоторые другие вещи.

Также есть и предыдущее обсуждение на StackOverflow:

Является ли BCrypt хорошим алгоритмом хэширования для использования в С#? Где я могу его найти?

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