Что такое salt и зачем он нужен при хранении паролей?

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

Что такое salt

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

Пример:

  • Пользователь A и пользователь B выбрали пароль "123456".

  • Без salt хэш обоих паролей будет одинаковым.

  • Если каждому из пользователей добавить уникальный salt, например k7Fg! для одного и 9zLp@ для другого, то результат хэширования станет уникальным для каждого случая.

Зачем нужен salt

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

  2. Предотвращение использования радужных таблиц (rainbow tables)
    Радужные таблицы — это заранее вычисленные таблицы хэшей для популярных паролей. Если база паролей защищена только хэшированием без salt, такие таблицы позволяют мгновенно определить пароль. Добавление salt делает радужные таблицы бесполезными, так как под каждый возможный salt пришлось бы создавать новую таблицу, что нереализуемо на практике.

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

  4. Дополнительный уровень сложности для перебора
    Salt увеличивает объём вычислений, необходимых злоумышленнику для подбора пароля. Вместо одной попытки на пароль ему придётся учитывать все возможные комбинации с разными salt.

Требования к использованию salt

  • Уникальность: salt должен быть уникальным для каждого пользователя или каждой записи.

  • Случайность: важно использовать криптографически стойкий генератор случайных чисел для создания salt.

  • Достаточная длина: чем длиннее salt, тем выше стойкость системы к атакам. Обычно применяют значения длиной от 16 байт и выше.

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

Применение salt в современных алгоритмах

Современные алгоритмы хэширования паролей, такие как bcrypt, scrypt, PBKDF2 или Argon2, изначально поддерживают работу с salt. Они автоматически добавляют его при генерации хэша и учитывают в процессе проверки пароля. Это снижает риск ошибок при реализации защиты вручную и делает хранение паролей более безопасным.