Соль в хешировании паролей: что это, зачем нужна и как правильно использовать

В современных ИТ‑средах защита учётных данных сотрудников – один из краеугольных камней информационной безопасности. Соль (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). Это дополнительно усложняет атаку, даже если злоумышленник получит доступ к БД.


Популярные алгоритмы хеширования с солью

Не все хеш‑функции одинаково подходят для защиты паролей. Рекомендуется использовать функции, специально предназначенные для этого:

  1. bcrypt – включает регулируемый work factor, автоматически генерирует и хранит соль.
  2. Argon2 – победитель конкурса Password Hashing Competition (PHC 2015), устойчив к GPU‑ и ASIC‑атакам.
  3. PBKDF2 – широко поддерживается, но менее эффективен против современных аппаратных ускорителей по сравнению с Argon2.
  4. 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 с уникальной солью, и проведите обучение команды. Эти шаги существенно снизят риск утечки учётных данных и защитят ваше рабочее место от многих кибератак.