В информационной безопасности компьютерных систем четко разграничиваются три взаимосвязанных, но принципиально различных процесса (модель AAA — Identification, Authentication, Authorization):
Процесс сообщения субъектом своего уникального имени системе («Кто ты?»).
login), email или табельного номера.Процесс подтверждения подлинности заявленного имени («Докажи, что ты — это ты!»).
Процесс проверки прав и полномочий уже успешно аутентифицированного пользователя («Что тебе разрешено делать?»).
Золотое правило современной программной инженерии гласит: база данных никогда не должна знать реальный пароль пользователя. Пароль преобразуется односторонней функцией, восстановить исходный текст из которой математически невозможно за разумное время.
Если хэшировать чистый пароль через MD5("password") или SHA256("admin123"), одинаковые входные данные всегда дают строго одинаковый хэш (детерминизм). Злоумышленники заранее вычисляют таблицы соответствий для сотен миллиардов популярных паролей. Имея доступ к дампу базы данных, взлом 90% учетных записей занимает доли секунды!
Криптографическая соль (Salt) — это последовательность случайных байт (длиной не менее 16–32 байт), генерируемая криптографически стойким генератором случайных чисел (CSPRNG) персонально для каждого пользователя при регистрации или смене пароля.
Эффект соли: даже если 1000 пользователей выберут одинаковый пароль «123456», из-за разной соли у каждого из них в базе данных будет абсолютно уникальный password_hash. Радужные таблицы становятся полностью бесполезными.
Алгоритм SHA-256 разрабатывался для сверхбыстрого подсчета контрольных сумм файлов (миллионы операций в секунду на современной видеокарте GPU). Для защиты паролей от полного перебора (Brute-Force) применяются специальные «медленные» адаптивные алгоритмы с настраиваемым фактором трудоемкости (Work Factor / Cost):
| Алгоритм | Фактор защиты | Формат в БД | Применение в промышленности |
|---|---|---|---|
| bcrypt | Основан на шифре Blowfish. Параметр cost (от 10 до 14) задает $2^{ ext{cost}}$ итераций. Устойчив к параллелизму на GPU. |
VARCHAR(60)Пример: $2b$12$e8N... (60 симв.) |
Стандарт де-факто для веб-приложений (Node.js, Python, Java, PHP, C#). |
| Argon2id | Победитель Password Hashing Competition (PHC). Контролирует время, использование оперативной памяти и число потоков. | VARCHAR(128)Пример: $argon2id$v=19$m=65536... |
Наиболее защищенный алгоритм нового поколения (рекомендация OWASP). |
| SHA-256 + Salt | Базовое хэширование с солью (256 бит). Высокая скорость, требует внешнего счетчика итераций (PBKDF2). | VARCHAR(64) (HEX) + salt VARCHAR(64) |
Академический стандарт для освоения алгоритмов защиты в курсах БД. |
В рамках реляционной модели данных создается триада таблиц подсистемы авторизации и аудита.
-- 1. Справочник ролей пользователей
CREATE TABLE roles (
id SERIAL PRIMARY KEY,
role_name VARCHAR(50) NOT NULL UNIQUE,
role_description VARCHAR(255) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL
);
-- 2. Таблица пользователей информационной системы
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
login VARCHAR(50) NOT NULL UNIQUE,
salt VARCHAR(64) NOT NULL,
password_hash VARCHAR(128) NOT NULL,
role_id INTEGER NOT NULL,
is_active BOOLEAN DEFAULT TRUE NOT NULL,
failed_attempts SMALLINT DEFAULT 0 NOT NULL,
locked_until TIMESTAMP WITH TIME ZONE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
CONSTRAINT fk_users_roles FOREIGN KEY (role_id)
REFERENCES roles(id) ON UPDATE CASCADE ON DELETE RESTRICT
);
-- 3. Таблица журнала аудита безопасности
CREATE TABLE audit_logs (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT,
attempted_login VARCHAR(50) NOT NULL,
event_type VARCHAR(30) NOT NULL,
ip_address VARCHAR(45) NOT NULL,
user_agent VARCHAR(255),
event_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL,
details TEXT,
CONSTRAINT fk_audit_users FOREIGN KEY (user_id)
REFERENCES users(id) ON UPDATE CASCADE ON DELETE SET NULL
);
CREATE INDEX idx_users_login ON users(login);
CREATE INDEX idx_audit_event_time ON audit_logs(event_time);
Диалог входа — первое окно, с которым взаимодействует пользователь. Любая ошибка в его реализации приводит либо к краху безопасности, либо к оттоку пользователей.
| Паттерн безопасности | Корректная реализация (Good UX / Secure) | Опасный антипаттерн (Vulnerability) |
|---|---|---|
| Сообщения об ошибках | Единое обобщенное сообщение: «Неверный логин или пароль». Система не сообщает, существует ли введенный логин. | Детализированные подсказки: «Пользователь не существует» или «Неверный пароль к учетной записи admin» (User Enumeration). |
| Отображение пароля | Символы маскируются маркерами (type="password") с возможностью временного просмотра по иконке глаза. |
Открытый текст пароля на экране, доступный стоящим за спиной людям (Shoulder Surfing). |
| Защита от перебора | Блокировка кнопки отправки на 3 секунды после каждого неверного клика; временная блокировка аккаунта на 15 мин после 5 ошибок. | Бесконечные попытки ввода без пауз и капчи, позволяющие автоматизированным скриптам перебирать пароли. |
| Контроль сессии | Автоматический выход из системы при простое более 15 минут (Inactivity Timeout); запись в аудит факта выхода. | Бессрочная авторизация на общедоступных терминалах и компьютерах общего пользования. |
is_active BOOLEAN в таблице users? Почему при увольнении сотрудника не рекомендуется выполнять запрос DELETE FROM users?audit_logs?