Соль — уникальное случайное значение, которое добавляется к каждому паролю перед хешированием, чтобы одинаковые пароли давали разные хеши.
Как работает соль
Системы не должны хранить сами пароли — только их хеши. Без соли один и тот же пароль всегда даёт один и тот же хеш: злоумышленник сравнивает украденные хеши с огромными заранее вычисленными таблицами (радужными таблицами) и сразу видит, у каких пользователей одинаковые пароли. С солью система генерирует случайное значение для каждого пользователя, объединяет его с паролем и хранит соль рядом с полученным хешем:
hash("password123" + "Q3v9...")— у одного пользователя,hash("password123" + "Lm81...")— у другого, и результаты совершенно разные.
Соль не секретна. Её задача — сделать каждый хеш уникальным, чтобы взламывать их приходилось по одному. Рекомендации NIST требуют соль не короче 32 бит; на практике библиотеки используют 16 байт. Перец (pepper) — другое понятие: секретное значение, которое хранится отдельно от базы, например в аппаратном модуле безопасности.
Чем соль важна для безопасности
Одна соль не защищает слабые пароли от перебора: современные видеокарты проверяют миллиарды быстрых хешей вроде MD5 или SHA-256 в секунду. Поэтому соль нужно сочетать с медленной, требовательной к памяти функцией хеширования паролей. Во многих утечках раскрывались пароли без соли или со слабым хешированием, и их взламывали за считаные дни.
Рекомендации
- Используйте специальные алгоритмы хеширования паролей: Argon2id, scrypt, bcrypt или PBKDF2 с большим числом итераций — они сами генерируют соль.
- Никогда не храните пароли в виде простого MD5, SHA-1 или SHA-256.
- Генерируйте соль криптографически стойким генератором, уникальную для каждого пароля.
- Пользователям — длинные уникальные пароли и менеджер паролей: соль не спасёт «123456».