В современном мире киберугрозы становятся всё изощрённее, а традиционные методы защиты (пароли, firewall, антивирус) часто оказываются недостаточными. Один из малоизвестных, но очень эффективных приёмов — использование соли (salt) не только для защиты данных, но и для идентификации потенциального злоумышленника. В этой статье мы разберём, что такое соль, как её правильно генерировать, и как с её помощью построить систему, позволяющую «вычислить» недоброжелателя.
Что такое соль?
Соль — это случайная строка, добавляемая к данным (чаще всего к паролю) перед их хешированием. Основные цели:
- Защита от предвычисленных атак (rainbow‑tables).
- Обеспечение уникальности хеша даже при одинаковых паролях.
- Усложнение перебора за счёт увеличения объёма входных данных.
Соль хранится в открытом виде рядом с хешем (например, в базе данных) и используется каждый раз при проверке пароля.
Пример
password = "P@ssw0rd"
salt = "4f3a9c7b2e"
hash = SHA256(salt + password) // 4f3a9c7b2eP@ssw0rd → 9b2e...
Почему соль помогает «вычислить» недоброжелателя?
Если соль генерируется уникально для каждой операции (не только для пароля), её можно превратить в триггер‑метку, которую будет использовать только конкретный злоумышленник. При попытке злоумышленника взаимодействовать с системой он оставит следы, привязанные к этой соли.
Самый простой способ – создать «мёдовые» (honey) учётные записи с уникальными солями. Когда злоумышленник попытается «взломать» такой аккаунт, система запишет использованные соли и сможет сопоставить их с известными «медовыми» записями.
Практический сценарий: Honeytoken‑соль в базе данных
Что такое honeytoken?
Honeytoken — это искусственный объект (учётная запись, API‑ключ, файл), который не используется легитимными пользователями. Любой доступ к нему считается подозрительным.
Как внедрить соль в honeytoken?
- Создаём «мёдовый» пользователь в системе (например,
evil_hunter). - Для этого пользователя генерируем уникальную соль длиной 16‑32 байта.
- Сохраняем соль в отдельном поле
honey_saltи фиксируем её значение в журнале безопасности. - При любой попытке аутентификации или доступа к данным система проверяет, использовалась ли именно эта соль.
Пример реализации (Python + PostgreSQL)
# -- coding: utf-8 --
import os, hashlib, psycopg2, datetime
def gen_salt(length=16):
return os.urandom(length).hex
def hash_password(password, salt):
return hashlib.sha256((salt + password).encode).hexdigest
conn = psycopg2.connect(dsn="dbname=mydb user=admin password=secret")
cur = conn.cursor
username = "evil_hunter"
plain_pass = "RandomPass123!"
salt = gen_salt
pwd_hash = hash_password(plain_pass, salt)
cur.execute("""
INSERT INTO users (username, pwd_hash, salt, honey_salt, created_at)
VALUES (%s, %s, %s, %s, %s)
""", (username, pwd_hash, salt, salt, datetime.datetime.utcnow))
conn.commit
print(f"Created honey user with salt: {salt}")
В данном примере поле honey_salt совпадает с обычной salt, но его значение фиксируется в отдельном журнале. При любой попытке входа мы сравниваем использованную соль с этим журналом.
Обнаружение доступа
# Функция проверки пароля и логирования
def check_login(username, password):
cur.execute("SELECT pwd_hash, salt, honey_salt FROM users WHERE username=%s", (username,))
row = cur.fetchone
if not row:
return False
stored_hash, salt, honey_salt = row
calc_hash = hash_password(password, salt)
if calc_hash == stored_hash:
# Успешный вход – проверяем, мёдовый ли аккаунт
if honey_salt == salt:
# Это наш honey‑токен, фиксируем инцидент
cur.execute("""
INSERT INTO security_events (event_type, username, ip, ts)
VALUES ('HONEY_LOGIN', %s, %s, %s)
""", (username, get_client_ip, datetime.datetime.utcnow))
conn.commit
alert_security_team(username)
return True
return False
Если злоумышленник использовал правильный пароль (или перебрал его), система фиксирует факт входа в security_events с типом HONEY_LOGIN. Это и есть «узнавание» недоброжелателя.
Расширенные техники с использованием соли
- Персонализированные соли для запросов API – каждый клиент получает уникальный токен‑соль, которую необходимо передавать в подписи запросов. Любой запрос без правильной соли отбрасывается и логируеться.
- Соль в заголовках HTTP – добавить случайный
X-Request-Saltв каждый запрос. Сервер проверяет, совпадает ли соль с ожидаемым набором (например, из whitelist). Неожиданные соли могут указывать на сканирование. - Соль в файлах журналов – при записи события в лог добавлять уникальную «соль‑идентификатор», которую знает только система. При попытке изменить журнал злоумышленник оставит следы несоответствия.
- Соль в базе данных для “пойманных” паролей – если система обнаруживает утечку пароля, она может «перехешировать» его новым солью и пометить как «подозрительный», чтобы отслеживать дальнейшее использование.
Как правильно генерировать и хранить соль
Требования к соли
- Длина — не менее 16 байт (32‑символьный hex‑строк).
- Криптографически стойкая генерация (
os.urandom,Crypto.Random). - Уникальность — для каждого объекта (пароль, токен, запрос) должна быть своя соль.
Хранение
Соль считается не секретной, поэтому её можно хранить в открытом виде рядом с хешем. Однако для honeytoken‑соли рекомендуется вести отдельный журнал доступа, защищённый от изменения (например, в отдельной базе данных с ограниченными правами).
Пример генерации в разных языках
| Язык | Код |
|---|---|
| Python | os.urandom(16).hex |
| JavaScript (Node.js) | require('crypto').randomBytes(16).toString('hex'); |
| PHP | bin2hex(random_bytes(16)); |
| C# | Convert.ToHexString(RandomNumberGenerator.GetBytes(16)); |
Этические и правовые аспекты
Использование honeytoken‑соли – мощный инструмент, но необходимо учитывать:
- Согласие пользователей — в некоторых юрисдикциях сбор и анализ данных без согласия может нарушать GDPR, закон о защите персональных данных и т.п.
- Минимизация ущерба — не следует создавать «мёдовые» учетные записи с правами администратора, иначе при их компрометации реальный ущерб будет высоким.
- Документирование — все honeytoken‑механизмы должны быть описаны в политике безопасности компании.
Шаг‑за‑шаг: Как внедрить систему «соль‑идентификатор» в вашем проекте
- Аудит текущей системы аутентификации. Выясните, где сейчас хранятся пароли и какие хеш‑алгоритмы используются.
- Определите цели. Нужно ли обнаруживать попытки взлома, или вы хотите отслеживать утечки API‑ключей?
- Создайте план генерации соли. Выберите длину (≥16 байт), способ генерации и место хранения (отдельное поле).
- Внедрите honeytoken‑аккаунты. Для каждого критически важного ресурса создайте минимум один «мёдовый» объект с уникальной солью.
- Обновите код аутентификации. Добавьте проверку соли и запись события в журнал безопасности.
- Настройте оповещения. При срабатывании honeytoken‑события система должна отправлять email/SMS администратору.
- Тестирование. Сымитируйте атаки (brute‑force, словарные атаки) и убедитесь, что события фиксируются.
- Документируйте процесс. Оформите SOP (Standard Operating Procedure) и обучите команду реагированию.
Соль — это не просто «приправа» к паролю. При правильном подходе она становится мощным индикатором активности злоумышленника. Создавая уникальные соли для honeytoken‑объектов, фиксируя их использование и интегрируя это в систему мониторинга, вы получаете возможность «узнать» своего недоброжелателя в реальном времени.
Помните, что эффективность любой защиты зависит от её правильной реализации и от того, насколько быстро вы реагируете на полученные сигналы. Используйте соль как часть комплексного подхода к кибербезопасности, и ваш «сольный» детектор станет надёжным союзником в борьбе с киберпреступниками.