Многие люди говорят «остановить радужные таблицы», не объясняя, что делают радужные таблицы или почему это их останавливает.
Радужные таблицы - это умный способ предсчитать большое количество хешей и сохранить их вменьше памяти, чем наивно потребовалось бы, и вы можете использовать их для очень быстрого обращения к хешу.Таблицы для простых функций, таких как hash = md5(password)
и hash = sha1(password)
, являются общими.
Однако они могут быть сгенерированы для ЛЮБОЙ хеш-функции, которая может быть описана как output = f(input)
.Если вы используете соль сайта для всех паролей пользователей, например, hash = md5(salt+password)
, вы можете создать функцию f
, f(password) = md5(salt+password)
.Поэтому вы можете создать радужные таблицы для этой функции, что займет много времени, но затем позволит вам очень быстро взломать каждый пароль в базе данных.
Если соль различна для каждого пароля, вы можете 't создать радужную таблицу, которая взломает все пароли в базе данных.Вы могли бы создать новый для каждого пользователя, но это было бы бессмысленно - наивное грубое принуждение не было бы медленнее.Таким образом, наличие отдельной соли для каждого пользователя останавливает атаку радужных таблиц.
Есть несколько способов сделать это.Популярные способы включают в себя:
- Отдельная соль для каждого пользователя, сохраненная вместе с другими данными в базе данных:
hash = hashfunction(salt + password)
- Глобальная соль и некоторое уникальное значение для пользователя:
hash = hashfunction(salt + password + user_id)
например - Глобальная соль и соль для каждого пользователя:
hash = hashfunction(global_salt + user_salt + password)
Наличие глобальной соли может добавить немного дополнительной сложности к взлому паролей, поскольку это может бытьхранится вне базы данных (например, в коде), к которой злоумышленники могут не получить доступ в случае взлома базы данных.Криптографически я не думаю, что это добавляет много, но на практике это может замедлить их.
Наконец, чтобы ответить на ваш актуальный вопрос:
Хранение соли вместе спользовательские данные не ослабляют хеш.Хеш-функции являются односторонними: учитывая хеш-пароль, даже несоленый, очень трудно найти этот пароль.Мотивация засоления состоит не в том, чтобы сделать отдельный хеш более безопасным, а в том, чтобы сделать сбор нескольких хешей более безопасным.Существует несколько векторов атаки для набора несоленных хэшей:
- Радужные таблицы
- Хеширование общих паролей (
123
, password
, god
) и проверка, если таковые имеютсясуществуют в базе данных, а затем скомпрометировать эти учетные записи - Искать идентичные хеши в базе данных, что означает идентичные пароли (вероятно)