Почему соли делают словарные атаки «невозможными»? - PullRequest
85 голосов
/ 25 августа 2010

Обновление: обратите внимание, я не спрашиваю, что такое соль, что такое радужная таблица, что такое атака по словарю или какова цель соли.Я спрашиваю: если вы знаете, что пользователи солят и хешируют, разве не легко вычислить их пароль?

Я понимаю процесс и сам внедряю его в некоторые из моих проектов.

s =  random salt
storedPassword = sha1(password + s)

В базе данных, которую вы храните:

username | hashed_password | salt

Каждая реализация засолки, которую я видел, добавляет соль либо в конце пароля, либо в начале:

hashed_Password = sha1(s + password )
hashed_Password = sha1(password + s)

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

Конечно, реализация, описанная выше, просто добавляет еще один шагдля хакера, без фактического решения основной проблемы?Какие есть альтернативы, чтобы обойти эту проблему, или я неправильно понимаю проблему?

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

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

Данные из нашей взломанной базы данных:

RawPassword (not stored)  |  Hashed   |     Salt
--------------------------------------------------------
letmein                       WEFLS...       WEFOJFOFO...

Словарь общих паролей:

   Common Password
   --------------
   letmein
   12345
   ...

Для каждой записи пользователя выполните циклобщие пароли и их хеширование:

for each user in hacked_DB

    salt = users_salt
    hashed_pw = users_hashed_password

    for each common_password

        testhash = sha1(common_password + salt)
        if testhash = hashed_pw then
           //Match!  Users password = common_password
           //Lets visit the webpage and login now.
        end if

    next

next

Надеюсь, это намного лучше иллюстрирует мою точку зрения.

Учитывая 10 000 общих паролей и 10 000 записей пользователей, нам потребуется вычислить 100 000 000 хешей, чтобы обнаружитькак можно больше паролей пользователей.Это может занять несколько часов, но на самом деле это не проблема.

Обновление теории взлома

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

Этот сайт утверждает, что может вычислять 2 300 000 000 хешей SHA1 в секунду с помощью графического процессора.(В реальной ситуации ситуация, вероятно, будет медленнее, но сейчас мы будем использовать эту приведенную цифру).

(((95 ^ 4) / 2300000000) / 2) * 10000 = 177 секунд

Учитывая полный диапазон из 95 печатаемых символов ASCII, с максимальной длиной 4 символа, разделенной на скорость вычисления (переменную), разделенную на 2 (при условии, что среднее время на обнаружение пароля в среднем потребует50% перестановок) для 10 000 пользователей потребуется 177 секунд, чтобы обработать пароли всех пользователей, длина которых <= 4. </p>

Давайте немного подстроим для реалистичности.

(((36 ^ 7) / 1000000000) / 2) * 10000 = 2 дня

При условии отсутствия чувствительности к регистру, с длиной пароля <= 7, только буквенно-цифровые символы, потребуется 4 дня длярешить для 10 000 пользовательских записей, и я сократил скорость алгоритма вдвое, чтобы отразить накладные расходы и неидеальные обстоятельства. </p>

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

Учитывая случай рекурсивного хеширования пароля 1000 раз, чтобы сделать эту задачу более дорогой в вычислительном отношении:

((((36 ^ 7) / 1 000 000 000) / 2) * 1000 секунд = 10,8839117 часов

Максимальная длина составляет 7 буквенно-цифровых символов, но не болеевыполнение вдвое меньше приведенного значения для одного пользователя .

Рекурсивное хеширование 1000 раз эффективно блокирует полную атаку, но целевые атаки на пользовательские данные по-прежнему уязвимы.

Ответы [ 11 ]

62 голосов
/ 25 августа 2010

Это не останавливает атаки по словарю.

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

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

Обновление :

Я должен был упомянуть об этом раньше, но некоторые (большинство?) Парольные системы используют разные соли для каждого пароля, вероятно, хранящиеся вместе с самим паролем.Это делает один радужный стол бесполезным.Вот как работает библиотека UNIX crypt , и современные UNIX-подобные ОС расширили эту библиотеку новыми алгоритмами хеширования.

Я точно знаю, что поддержка SHA-256 и SHA-512 были добавлены в более новые версии крипт GNU.

30 голосов
/ 25 августа 2010

Да, вам нужно всего 3 дня для sha1 (соль | пароль). Вот почему хорошие алгоритмы хранения паролей используют хеширование с 1000 итерациями: вам потребуется 8 лет.

30 голосов
/ 25 августа 2010

Точнее говоря, словарная атака , т. Е. Атака, в которой пробуются все слова в исчерпывающем списке, становится не «невозможной», но она становится непрактичной : каждый бит соли удваивает объем памяти и необходимые вычисления .

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

Пример. При использовании 64-битной соли (т.е. 8 байт) вам необходимо проверить 2 64 дополнительные комбинации паролей в атаке по словарю. Со словарем, содержащим 200 000 слов, вам нужно будет сделать

200 000 * 2 64 = 3,69 * 10 24

тесты в худшем случае - вместо 200 000 тестов без соли.

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

Обновление

Ваше обновление предполагает, что злоумышленник уже знает соль (или украл ее). Это конечно другая ситуация. Тем не менее, злоумышленник не может использовать предварительно вычисленный радужный стол. Здесь важна скорость хеширования. Чтобы атака была непрактичной, функция хеширования должна быть медленной. MD5 или SHA не являются хорошими кандидатами здесь, потому что они разработаны, чтобы быть быстрыми, более подходящими кандидатами для алгоритмов хеширования являются Blowfish или некоторые его варианты.

Обновление 2

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

Достаточно с радужными таблицами: что нужно знать о безопасных схемах паролей

Следствие статьи: Используйте соленые хэши, созданные с помощью bcrypt (на основе Blowfish) или Eksblowfish , что позволяет использовать настраиваемое время настройки для замедления хеширования.

17 голосов
/ 25 августа 2010

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

С солью пространство, необходимое для хранения словаря, быстро увеличивается & hellip; так быстро, что попытка предварительно вычислить словарь паролей вскоре становится бессмысленной.

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


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

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

Многие люди используют PBKDF2, ключевую функцию деривации, которая возвращает результаты в хэш-функцию тысяч раз. Алгоритм "bcrypt" аналогичен, используя медленный итеративный вывод ключа.

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


Комментарии

Ниже приведены комментарии, которые я сделал по этому вопросу.


Без соли злоумышленник не использовал бы метод, показанный в «Обновлении 2». Он просто сделал бы поиск в предварительно вычисленной таблице и получил бы пароль за O (1) или O (log n) времени (n - число паролей-кандидатов). Соль препятствует этому и заставляет его использовать подход O (n), показанный в «Обновлении 2».

После того, как мы превратились в атаку O (n), мы должны рассмотреть, сколько времени занимает каждая попытка. Усиление ключа может привести к тому, что каждая попытка в цикле займет целую секунду, а это означает, что время, необходимое для тестирования паролей 10k на пользователях 10k, увеличится с 3 дней до 3 лет & hellip; и, имея только 10 тыс. паролей, вы, вероятно, взломаете ноль паролей за это время.

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

Усиление ключа является частью стандартных алгоритмов получения ключей PBKDF1 и PBKDF2 из PKCS # 5, которые создают отличные алгоритмы обфускации паролей («производный ключ» - это «хеш»).

Многие пользователи StackOverflow ссылаются на эту статью , потому что это был ответ на сообщение Джеффа Этвуда об опасностях радужных таблиц. Это не моя любимая статья, но она обсуждает эти концепции более подробно.


Конечно, вы предполагаете, что у злоумышленника есть все: соль, хэш, имя пользователя. Предположим, злоумышленник - сотрудник коррумпированной хостинговой компании, который сбросил таблицу пользователей на вашем фан-сайте myprettypony.com. Он пытается восстановить эти пароли, потому что собирается развернуться и посмотреть, не использовали ли ваши поклонники пони один и тот же пароль в своих учетных записях на citibank.com.

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

7 голосов
/ 25 августа 2010

Точка засолки заключается в предотвращении амортизации усилий атакующего.

Без соли, одна таблица предварительно вычисленных записей хеш-пароля (например, MD5 из всех буквенно-цифровых 5-символьных строк, которые легко найти в Интернете) может использоваться для каждого пользователя в каждой базе данных в мире.

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

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

Конечно, это мало помогает защите действительно слабых паролей прямо из словаря, но защищает достаточно надежные пароли от этой амортизации.

6 голосов
/ 25 августа 2010

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

Если вы попытаетесь сохранить хэш в секрете, злоумышленник также не сможет проверить хэши.

Редактировать - только что заметил, что главное замечание было сделано в комментарии выше.

5 голосов
/ 25 августа 2010

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

Итак, предположим, что мы работаем с SHA1, воспользовавшись преимуществами недавних эксплойтов, обнаруженных с помощью этого алгоритма, и предположим, что у нас есть компьютер, работающий с 1 000 000 хешей в секунду, это займет 5,3 млн. Миллионовгоды, чтобы найти столкновение , так что да, php может работать 300 в секунду, большой провал, на самом деле не имеет значения.Причина, по которой мы солим, заключается в том, что если кто-то потрудился сгенерировать все общие словарные фразы (2 ^ 160 человек, добро пожаловать в подвиги эпохи 2007 года).

Итак, вот настоящая база данных, с 2 пользователями, которых я использую для тестирования иАдминистративные цели.

RegistrationTime        UserName        UserPass    
1280185359.365591       briang      a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087       test        5872548f2abfef8cb729cac14bc979462798d023

Фактически, схема засолки - это ваш sha1 (время регистрации + имя пользователя).Давай, скажи мне мой пароль, это настоящие пароли в производстве.Вы даже можете сидеть там и составлять список слов в php.Сойти с ума.

Я не сумасшедший, я просто знаю, что это безопасно.Ради интереса, пароль теста - test.sha1(sha1(1281546174.065087 + test) + test) = 5872548f2abfef8cb729cac14bc979462798d023

Вам потребуется создать целую радужную таблицу с 27662aee8eee1cb5ab4917b09bdba31d091ab732 для , просто для этого пользователя.Это означает, что я действительно могу позволить, чтобы все мои пароли не были скомпрометированы одной радужной таблицей, хакеру нужно сгенерировать целую радужную таблицу для теста 27662aee8eee1cb5ab4917b09bdba31d091ab732 и снова f3f7735311217529f2e020468004a2aa5b3rief для.Вспомните 5,3 миллиона миллионов лет для всех хэшей.Подумайте о размерах хранения только 2 ^ 80 хешей (это более 20 yottabytes ), этого не произойдет.

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

3 голосов
/ 25 августа 2010

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

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

2 голосов
/ 18 ноября 2010

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

2 голосов
/ 25 августа 2010

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

...