Как соль пароля помогает против атаки таблицы радуги?


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

Я видел много учебников, предлагающих использовать соль следующим образом:

$hash =  md5($salt.$password)

рассуждение заключается в том, что хэш теперь сопоставляется не с исходным паролем, а с комбинацией пароля и соль. Но скажи $salt=foo и $password=bar и $hash=3858f62230ac3c915f300c664312c63f. Теперь кто-то с радужной таблицей может перевернуть хэш и придумать вход "foobar". Затем они могут попробовать все комбинации паролей (f, fo, foo, ... oobar, obar, bar, ar, ar). Это может занять несколько миллисекунд, чтобы получить пароль, но не более того.

другое использование, которое я видел, находится в моей системе linux. В/etc / shadow хэшированные пароли фактически хранятся С соль. Например, соль из " foo "и пароль" bar " будет хэш к этому:$foo$te5SBM.7C25fFDu6bIRbX1. Если хакер каким-то образом смог добраться до этого файла, я не вижу, какой цели служит соль, так как обратный хэш te5SBM.7C25fFDu6bIRbX как известно, содержит "foo".

Спасибо за любой свет кто-нибудь может пролить на это.

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

10 197

10 ответов:

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

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

To поймите первый, представьте себе один файл паролей, который содержит сотни имен пользователей и паролей. Без соли я мог бы вычислить " md5 (попытка[0])", а затем Сканировать файл, чтобы увидеть, появляется ли этот хэш в любом месте. Если соли присутствуют, то я должен вычислить "md5(соль[a] . попытка[0])", сравнить с записью A, затем " md5(соль[b]. попытка[0])", сравнить с записью B и т. д. Теперь у меня есть n раз столько работы надо сделать, где n число Логинов и паролей содержится в файле.

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

но если файл пароля солится, то радужная таблица должна содержать "соль . пароль" предварительно хешируется. Если соль достаточно случайна, это очень маловероятно. Вероятно, у меня будут такие вещи, как "hello" и "foobar" и "qwerty" в моем списке часто используемых, предварительно хэшированных паролей (таблица rainbow), но у меня не будет таких вещей, как "jX95psDZhello" или "LPgB0sdgxfoobar" или "dZVUABJtqwerty". Это сделало бы Радужный стол непомерно велик.

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

два различных использования соли

Я видел много учебников, предлагающих использовать соль следующим образом:

$hash = md5($salt.$password)

[...]

другое использование, которое я видел, находится в моей системе linux. В/etc / shadow хэшированные пароли фактически хранятся вместе с солью.

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

безопасность хэш

теперь кто-то с радужной таблицей может перевернуть хэш и придумать вход "foobar".

[...]

начиная с обратного хэша te5SBM.7C25fFDu6bIRbX это известно, что содержит "foo".

невозможно отменить хэш как таковой (по крайней мере, теоретически). Хэш "foo "и хэш" saltfoo " имеют ничего в общем. Изменение даже одного бита на входе криптографической хэш-функции должно полностью изменить выход.

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

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

качество соль

но сказать $salt=foo

" фу " было бы очень плохой выбор соли. Обычно вы используете случайное значение, закодированное в ФОРМАТ ASCII.

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

нападение

если хакер каким-то образом смог добраться до этого файла, я не вижу, какой цели служит соль,

Радуга таблица атаки всегда должен /etc/passwd (или какая бы база паролей ни использовалась), иначе как бы вы сравнили хэши в радужной таблице с хэшами реальных паролей?

что касается цели: предположим, злоумышленник хочет построить радужную таблицу для 100 000 часто используемых английских слов и типичных паролей (подумайте "секрет"). Без соли ей пришлось бы предварительно вычислить 100 000 хэшей. Даже с традиционной солью UNIX из 2 символов (каждый из 64 выбор:[a–zA–Z0–9./]) Она должна была бы вычислить и хранить 4,096,000,000 хэшей... совсем неплохо.

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

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

еще один отличный вопрос, со многими очень вдумчивыми ответами - +1 к так!

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

почему это важно?

представьте себе базу данных паролей в крупной компании на северо-западе США. Предположим, что это содержит 30 000 записей, из которых 500 имеют пароль bluescreen. Предположим далее, что хакеру удается получить этот пароль, скажем, прочитав его по электронной почте от пользователя в ИТ-отдел. Если пароли несоленые, хакер может найти хэшированное значение в базе данных, а затем просто сопоставить его с шаблоном, чтобы получить доступ к другим учетным записям 499.

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

Я искал хороший метод для применения солей и нашел эту превосходную статью с образцом кода:

http://crackstation.net/hashing-security.htm

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

для сохранения пароля:

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

для проверки пароля :

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

причина, по которой соль может вызвать сбой атаки радужной таблицы, заключается в том, что для n-бит соли радужная таблица должна быть в 2^n раз больше размера таблицы без соли.

ваш пример использования " foo " в качестве соли может сделать радужную таблицу в 16 миллионов раз больше.

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

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

подобные выпады неэффективно в том случае, когда пароли содержат гораздо больше символов и не соответствуют общим форматам на основе слов. Пользователь с надежным паролем для начала не будет уязвим для этого стиля атаки. К сожалению, многие люди не выбирают хорошие пароли. Но есть компромисс, вы можете улучшить пароль пользователя, добавив к нему случайный мусор. Так что теперь вместо" hunter2 "их пароль может стать эффективно" hunter2908!fld2R75{R7/; 508PEzoz^U430", который является гораздо более сильным паролем. Однако, поскольку теперь вам нужно сохранить этот дополнительный компонент пароля, это снижает эффективность более сильного составного пароля. Как оказалось, есть еще чистая выгода для такой схемы, так как теперь каждый пароль, даже слабые, больше не уязвимы для одной и той же предварительно вычисленной хэш-таблицы / радуги. Вместо этого каждая запись хэша пароля уязвима только для уникальной хэш-таблицы.

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

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

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

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

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

обе эти цели по-прежнему даже если эти соли публичные.

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

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

таким образом, хакер может использовать это в своих интересах, а не используя только грубую силу. Он не будет искать пароли, такие как aaa, aab, aac... но вместо этого используйте слова и общие пароли (например, имена Властелина колец! ;))

Так что если мой пароль Леголас хакер мог бы попробовать это и угадать с "несколькими" попытками. Однако если мы солим пароль и он становится fooLegolas хэш будет отличаться, поэтому атака по словарю будет неудачной.

надеюсь, что это поможет!

Я предполагаю, что вы используете функцию PHP - - - md5 () и переменные $ Preferred --- тогда вы можете попробовать посмотреть эту статью теневой пароль HOWTO особенно 11-й абзац.

кроме того, вы боитесь использовать алгоритмы дайджеста сообщений, вы можете попробовать реальные алгоритмы шифрования, такие как те, которые предоставляются mcrypt модуль, или более сильные алгоритмы дайджеста сообщений, такие как те, которые обеспечивают mhash модуль (sha1, sha256, и другие.)

Я думаю, что более сильный алгоритм дайджеста сообщений является обязательным. Известно, что у MD5 и SHA1 возникают проблемы с столкновением.