Почему соли делают словарные атаки «невозможными»?


85

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

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

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% перестановок) для 10000 пользователям потребуется 177 секунд, чтобы разработать пароли всех пользователей, длина которых <= 4.

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

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

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

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

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

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

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

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


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

25
Потому что крекеры похожи на слизней, а соль сушит слизистую на их коже и убивает их.
TED

6
@TED: Я предпочитаю соленые крекеры. Соленых слизней не так много.
FrustratedWithFormsDesigner

3
@Tom - в вашем примере атака. Если соли нет, то злоумышленник может «для каждого общего пароля хешировать пароль. Соответствует ли он одному или нескольким пользователям? Да, у меня есть их пароль» - злоумышленник может атаковать все пароли «параллельно» , без дополнительной оплаты.
Damien_The_Unbeliever

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

Ответы:


31

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


3
+1, самый краткий и точный ответ, я не знал, что это вариант.
Том Галлен,

По-видимому, вы никогда не выполняли хеш-тест в своей системе. Вы можете делать МНОГО МИЛЛИОНОВ вычислений sha1 в секунду. 1000 патронов для атакующего бессмысленны. Также -1, потому что sha1 - неработающая хеш-функция.
ладья

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

1
@Rook, 1000 раундов означает, что перебор займет в 1000 раз больше времени. Мне кажется, это хорошая особенность.
Том Галлен,

Если злоумышленник может угадать пароль, это то же самое для входа в систему (или что-то ускользнуло от меня? lol)
khaled_webdev 07

62

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

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

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

Обновление :

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

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


17
+1 Salt предотвращает использование предварительно вычисленных списков хэшей (радужных таблиц). Атакующий должен начать все сначала.
Ян Бойд,

2
В PHP вы можете использовать библиотеки mcrypt или bcrypt для лучшего шифрования, чем md5 или sha1. Если вы застряли с md5 или sha1, вам следует «растянуть», когда вы хешируете пароль 1000 раз, прежде чем придете к тому, что хранится в базе данных. При этом энтропия остается прежней, но увеличивается время вычисления хэша.
Malfist

2
@ Том Галлен, какие статьи ты читаешь? Самостоятельные эксперты или рецензируемые статьи в научном журнале?
Malfist

7
И именно ваш средний разработчик Джо делает те блоги / справочные посты о том, как написать «безопасную» систему. Безопасность - это не то, что вы можете подобрать на стороне, это требует обширных знаний. Это несправедливо? Наверное. Это безопасно? В некоторой степени. Есть причины, по которым есть эксперты по безопасности. Но опять же, не все должно быть так же безопасно, как Форт-Нокс. Лучшая политика здесь - использовать предварительно созданную систему, разработанную этими экспертами, и изменять ее в соответствии с вашими потребностями.
Malfist

3
@Michael: с более длинной солью вам нужно предварительно вычислить все возможные значения соли, чтобы она отобразилась в радужной таблице. Дело в том, что вы не сохраняете одну и ту же соль для всех паролей, вы выбираете ее случайным образом для каждого пароля и сохраняете ее в базе данных рядом с сохраненным паролем с хешированной солью. Таким образом, хакеру понадобится запись в радужной таблице для каждой возможной крупной соли, в результате чего таблица будет слишком большой, чтобы ее можно было реализовать, и в этом суть.
Colin DeClue

31

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

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

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

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

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

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

Обновить

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

Обновление 2

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

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

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


4
@Tom Gullen - даже при разумной политике надежных паролей словарь из сотен миллионов или нескольких миллиардов кандидатов, вероятно, получит несколько совпадений, потому что все пароли не одинаково вероятны (потому что люди используют мнемонику, а не ГСЧ, чтобы выбрать их) . Словарь такого размера можно предварительно вычислить в товарных системах, если не используется соль. Если используется соль, злоумышленник должен каждый раз пересчитывать хеши, и если выполняется достаточное количество итераций хеша, скорость атаки злоумышленника может быть снижена до нескольких попыток в секунду.
erickson

3
-1 от меня: держаться в секрете совсем не суть солей. В любом случае они нужны вам для проверки паролей, поэтому любая попытка сохранить их в секрете скорее всего сделает систему более уязвимой из-за дополнительной сложности, чем на самом деле.
Майкл Боргвардт,

2
@ 0xA3: еще раз: быть неизвестным злоумышленнику - не главное . Ваша машина должна каким-то образом получить к ней доступ, чтобы злоумышленник, взломавший машину, тоже мог ее получить. Любой сценарий, в котором злоумышленник не знает соли, - отвлекающий маневр.
Майкл Боргвардт,

1
Думаю, стоит упомянуть, что в связанной статье неверно описаны радужные таблицы. Он описывает простое приложение словаря. Радужные таблицы действительно совсем другие (и несколько более сложные). Есть довольно приличное объяснение того, как действительно работают радужные таблицы : kestas.kuliukas.com/RainbowTables
Джерри Коффин

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

17

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

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

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


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

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

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

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


Комментарии

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


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

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

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

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

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


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

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


1
Я думаю, что под «атакой по словарю» Том подразумевает опробование известных слабых паролей (т.е. прямо из словаря человеческого языка), а не предварительно вычисленных хэш-таблиц с открытым текстом - это также то, о чем я впервые думаю, когда читаю «словарь» в этот контекст.
Майкл Боргвардт

@Michael Borgwardt: Я согласен, @erickson относится к предварительно вычисленным словарным атакам.
Дирк Фоллмар

1
Salt останавливает атаки по заранее вычисленному словарю. Усиление клавиш останавливает словарные атаки. Оба должны использоваться вместе для безопасной парольной аутентификации.
erickson

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

7

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

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

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

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

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


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

6

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

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

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


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

@snemarch - Да, большое спасибо за это важное отличие!
Доминик Вебер,

5

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

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

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

RegistrationTime        UserName        UserPass    
1280185359.365591       briang      a50b63e927b3aebfc20cd783e0fc5321b0e5e8b5
1281546174.065087       test        5872548f2abfef8cb729cac14bc979462798d023

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

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

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

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


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

Положите деньги туда, где есть ваш рот?
Incognito,

Конечно, но вы только что сказали мне, какой пароль в вашем примере, дайте мне соль, хешированный пароль и как вы комбинируете соль + пароль (не рекурсивно), и пока пароль <= 5 буквенно-цифровых символов в нижнем регистре (без пробелов / специальные символы) Я дам вам знать, что это в этом поле. Если вы хотите, чтобы я вложил в него деньги, как вы предлагаете, дайте мне знать, хотя мой комментарий в несколько минут, вероятно, сильно недооценен, но в течение нескольких часов да.
Tom Gullen

1
На самом деле, возможно, секунды, см. Golubev.com/hashgpu.htm, который использует GPU для вычисления, как указано «2300M / s SHA1 хэшей в секунду». С полным диапазоном из 95 символов ASCII от 1 до 6 символов мы можем взломать его менее чем за 6 минут. Если у нас есть только строчные буквенно-цифровые символы, до 8 символов длиной <25 минут. В базе данных из 10 000 пользовательских записей мы могли бы найти все 4-х символьные полные пароли ASCII менее чем за 200 секунд ((((95 ^ 4) / 2300000000) / 2) * 10000). (Накладные расходы больше, чем указано, и указанные скорости графического процессора, вероятно, являются идеальными ситуациями).
Tom Gullen

Да, соление не мешает вам подобрать пароль. Это затрудняет создание ((10 ^ 5) * (94 ^ 10)) = 10 ^ 24, если у пользователей около 10-символьных паролей, что намного сложнее, чем 10 ^ 19 без хешей. Опять же, это не для того, чтобы усложнить взлом одного пароля, а для того, чтобы сделать невозможным взлом всех паролей с помощью предварительно обработанной радужной таблицы. (и проверьте мою математику здесь, но я считаю, что 10 ^ 25/2300000000/60/60/24/365/1000 = 137 869 ~ milinea для каждого пароля). Если нам нужны более надежные пароли, мы не используем их, мы используем такие вещи, как обмен ключами Диффи – Хеллмана.
Incognito,

3

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

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


В сценарии OP у злоумышленника есть соли из базы данных, и ему придется пробовать каждую соль с каждой записью в «словаре». ...Я думаю.
FrustratedWithFormsDesigner

2

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


2

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


1

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

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

Итак, предположим, что ваша соль - что-то безопасное и случайное, скажем ()% ISLDGHASKLU ( % #% #, радужная таблица хакера должна иметь запись для 1 * ()% ISLDGHASKLU (*% #% #. Теперь используем радужную таблицу даже этот простой пароль больше не применим.


См. Обновление № 2, у вас будут просто необработанные пароли и вычислить все хэши по солям для каждой записи пользователя.
Том Галлен,

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

3
@Tom Gullen: создание соленых радужных таблиц возможно только в том случае, если используются соли всего сайта; добавление соли для каждого пользователя делает атаки радужной таблицы практически бесполезными.
Snemarch
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.