В современных ИТ‑средах защита учётных данных сотрудников – один из краеугольных камней информационной безопасности. Соль (salt) – простой, но чрезвычайно эффективный механизм, который значительно усложняет атаки на хранимые пароли. В этой статье мы подробно разберём, что такое соль, почему она важна, как её правильно применять и какие практики помогут сделать ваше рабочее место более надёжным.
Что такое соль?
Соль – это случайная последовательность байтов (или символов), которая добавляется к паролю перед его хешированием. Результат выглядит так:
hash = HashFunction(password + salt)
Соль хранится вместе с получившимся хешем (обычно в той же строке базы данных) и используется при каждой проверке пароля: система извлекает соль, добавляет её к введённому пользователем паролю и сравнивает полученный хеш с сохранённым.
Почему соль эффективна?
- Уничтожает предварительно вычисленные таблицы (rainbow tables). Без соли одинаковый пароль у разных пользователей даёт одинаковый хеш, что позволяет злоумышленнику использовать готовую таблицу. Соль делает каждый хеш уникальным, даже если пароли совпадают.
- Увеличивает вычислительную сложность brute‑force атак. Attacker должен перебрать не только все возможные пароли, но и все возможные соли для каждого пользователя.
- Защищает от атаки «pass‑the‑hash». Поскольку хеш зависит от соли, просто скопировать хеш из базы и использовать его в другой системе невозможно без знания той же соли.
Эти свойства подтверждаются в обсуждении на Reddit ([1]) и в статье о безопасном проектировании ПО на Habr ([2]).
Как правильно генерировать и хранить соль
Длина и источник энтропии
Соль должна быть достаточно длинной (обычно 16 – 32 байта) и генерироваться криптостойким генератором случайных чисел (CSPRNG). Примеры:
- Python:
os.urandom(16)илиsecrets.token_bytes(16) - Node.js:
crypto.randomBytes(16) - Java:
SecureRandom - C#:
RandomNumberGenerator.GetBytes(16)
Хранение соли
Соль хранится открытым текстом рядом с хешем. Обычный формат записи в базе данных:
$algorithm$iterations$salt$hash
Например, для bcrypt:
$2b$12$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36WQoeG6Lruj3vjPGga31lW
Где после второго знака доллара находится стоимость (work factor), затем соль, а finally – хеш.
Не используйте одну и ту же соль для всех пользователей
Повторное использование соли сводит на нет её преимущества. Каждый аккаунт должен иметь уникальную соль.
Рассмотрите использование «pepper»
Pepper – это секретное значение, добавляемое к паролю вместе с солью, но хранящееся отдельно от базы данных (например, в переменной окружения или HSM). Это дополнительно усложняет атаку, даже если злоумышленник получит доступ к БД.
Популярные алгоритмы хеширования с солью
Не все хеш‑функции одинаково подходят для защиты паролей. Рекомендуется использовать функции, специально предназначенные для этого:
- bcrypt – включает регулируемый work factor, автоматически генерирует и хранит соль.
- Argon2 – победитель конкурса Password Hashing Competition (PHC 2015), устойчив к GPU‑ и ASIC‑атакам.
- PBKDF2 – широко поддерживается, но менее эффективен против современных аппаратных ускорителей по сравнению с Argon2.
- scrypt – тоже хороший выбор, требует большого объёма памяти.
Пример использования bcrypt в Node.js:
const bcrypt = require('bcrypt');
const saltRounds = 12;
async function hashPassword(plain) {
const salt = await bcrypt.genSalt(saltRounds); // генерирует уникальную соль
return await bcrypt.hash(plain, salt);
}
async function verifyPassword(plain, hash) {
return await bcrypt.compare(plain, hash);
}
Пример на Python с passlib (поддерживает bcrypt, argon2, pbkdf2_sha256):
from passlib.hash import bcrypt
def hash_password(pwd):
return bcrypt.hash(pwd) # автоматически генерирует соль
def verify_password(pwd, hashed):
return bcrypt.verify(pwd, hashed)
Внедрение соли в корпоративные процессы
Политика паролей
- Требовать минимальную длину пароля (не менее ).
- Запрещать использование распространённых паролей (списки из
rockyou.txtи т.п.). - Обязывать регулярную смену паролей (например, каждые 90 дней) только если есть подозрение на компрометацию; иначе лучше полагаться на надежное хеширование.
Обучение сотрудников
Проводить краткие тренинги о том, почему важно не использовать одинаковые пароли на разных сервисах и как работает защита с солью. Можно показать простую демонстрацию: одинаковый пароль без соли даёт одинаковый хеш, а с солью – разные.
Мониторинг и аудит
- Журналировать попытки аутентификации (успешные и неудачные).
- Настраивать оповещения о множестве неудачных попыток из одного IP‑адреса (возможная brute‑force атака).
- Периодически проверять базу данных на наличие одинаковых солей (должно быть нулевых совпадений).
Резервное копирование и защита ключей
Если вы используете pepper, храните его в отдельном хранилище секретов (HashiCorp Vault, AWS Secrets Manager, Azure Key Vault) и обеспечьте строгий контроль доступа.
Тестирование на проникновение
Включайте в регулярные пентесты проверку устойчивости хеш‑хранилища к атакам rainbow table и brute force. Используйте инструменты типа hashcat в режиме атаки по словарю с учётом соли.
Чего следует избегать
- Использовать слабые хеш‑функции (MD5, SHA1, SHA256 без работы). Их можно быстро перебрать даже с солью.
- Генерировать соль из предсказуемых источников (например, timestamp, user ID).
- Хранить соль и хеш в разных таблицах без связи – это усложняет восстановление и может привести к ошибкам.
- Повторно использовать одну и ту же соль при обновлении пароля – всегда генерируйте новую соль при каждом изменении пароля.
Соль – это фундаментальный, но часто недооценённый элемент защиты паролей. Правильное её применение делает атаки на учётные данные значительно сложнее и дороже для злоумышленника, тем самым повышая общую безопасность рабочего места. Следуя рекомендациям по генерации, хранению и использованию современных алгоритмов хеширования (bcrypt, Argon2, PBKDF2), а также укрепляя организационные процессы (обучение, политики, мониторинг), вы создаёте надёжный барьер против большинства типов угроз, связанных с компрометацией паролей.
Начните с малого: оцените текущие методы хранения паролей в ваших системах, замените устаревшие хеши на bcrypt или Argon2 с уникальной солью, и проведите обучение команды. Эти шаги существенно снизят риск утечки учётных данных и защитят ваше рабочее место от многих кибератак.