Какова цель соли?


В системе Linux пароли хранятся с использованием хэша MD5. Почему использование "соли" может защитить систему больше? В частности, я хочу прояснить следующие два

  1. Соль, Как говорят, хранится в чистый текст с хэшем, тогда как он может предотвратить атакующего, когда злоумышленник знает цену соли. (Злоумышленником может быть сама система сам администратор, который может проверить /etc/shadow.
  2. Если соль генерируется случайным образом каждый раз, как может система сравните хэш с проверки подлинности пользователь?

Например, пользователь A имеет пользовательскую соль s1 и генерирует h1; h1 = md5(password.s1);. В следующий раз он использует соль s2, и система должна сгенерировать другой хэш, h2 = md5(password.s2). Поскольку h1 не равно h2, как система может аутентифицировать пользователя?

4 8

4 ответа:

MD5-это хэш, как вы знаете, поэтому, если вы дадите ему вход, такой как 'PASSWORD', вы получите уникальный (надеюсь, однако MD5 имеет коллизии в эти дни) выход, такой как '3DE2AF...".

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

Цель соли состоит в том, чтобы добавить произвольные случайные данные к строка хэшируется таким образом, что вы увеличиваете длину ввода до хэша. Это означает, что общие радужные таблицы, которые ожидают обратного ввода пароля в хэш, не будут работать. Конечно, радужные таблицы являются просто обратными поисками, вы можете просто создать радужную таблицу, чтобы компенсировать все возможные выходы password+salt. Именно здесь увеличение длины вступает в свои права; из-за природы реверсирования хэшей, дисковое пространство для генерации реверсов для очень длинных хэш-входов скоро становится неосуществимым. Алфавитно-цифровые радужные таблицы на 6-8 символов занимают уже пару гигабайт; увеличьте длину и классы символов, и вы начнете говорить кратно 10 ГБ.

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

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

Edit подробнее здесь. Видишь crypt() для первого примера этого. @CodeInChaos ссылается на PBKDF2, который является частью PKCS#5. Новые разработки скрипт.

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

Edit 2 Прояснил мою запись соли-я думаю, что танцевал вокруг ключевого вопроса дискового пространства раньше.

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

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

md5(md5(md5(password)));

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

md5(md5(md5(password+string)+string)+string);

Одной из причин может быть то, что если два человека используют один и тот же пароль неосознанно, они будут генерировать один и тот же MD5. Один из них может просто увидеть /etc/тень и угадать пароль других парней.

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

Когда вы шифруете данные, они все еще могут быть атакованы атаками Брюса-силы и атаками радуги. При засолке в конце зашифрованных данных вы добавляете несколько дополнительных битов. Таким образом, злоумышленник не может получить исходные данные должным образом.