Фундаментальный теоретический конспект

Практическое занятие №9: проект БД и форма входа, этап 1
Дисциплина: ОП.08 Основы проектирования баз данных | Тема 4. Проектирование структур баз данных (§2.2 с.7–8) | СПО СИЭУиП

1. Архитектурная парадигма: Идентификация, Аутентификация и Авторизация

В информационной безопасности компьютерных систем четко разграничиваются три взаимосвязанных, но принципиально различных процесса (модель AAA — Identification, Authentication, Authorization):

1. Идентификация (Identification)

Процесс сообщения субъектом своего уникального имени системе («Кто ты?»).

  • Ввод логина (login), email или табельного номера.
  • Поиск записи субъекта в базе данных по индексу.
2. Аутентификация (Authentication)

Процесс подтверждения подлинности заявленного имени («Докажи, что ты — это ты!»).

  • Проверка секретного фактора знания (пароль, PIN-код).
  • Проверка фактора владения (OTP-код из SMS / TOTP-приложения, смарт-карта).
  • Сверка криптографического хэша пароля с эталоном в БД.
3. Авторизация (Authorization)

Процесс проверки прав и полномочий уже успешно аутентифицированного пользователя («Что тебе разрешено делать?»).

  • Проверка ролевых прав (RBAC — Role-Based Access Control).
  • Предоставление доступа к таблицам, отчетам, операциям проведения документов или блокировка запрещенных действий (HTTP 403 Forbidden / Access Denied).

Схема полного цикла защищенного входа в информационную систему

+---------------------+ +------------------------+ +--------------------------+ | Клиент (UI Форма) | | Сервер приложения (API)| | База данных (СУБД) | +---------------------+ +------------------------+ +--------------------------+ | | | 1. Ввод: login, password | | |-------- 2. POST /api/login ------>| | | (TLS шифрование) | | | |--- 3. SELECT * FROM users --------->| | | WHERE login = :login | | |<-- 4. {id, salt, password_hash, ...}| | | is_active, role_id | | | | | | 5. Проверка: | | | is_active == TRUE ? | | | 6. Вычисление: | | | calc_hash = Hash(pwd + salt) | | | 7. Сравнение за константное время: | | | calc_hash == password_hash ? | | | | | |--- 8. INSERT INTO audit_logs ------>| | | (user_id, 'LOGIN_SUCCESS', IP)| | | | |<-- 9. HTTP 200 OK + JWT/Session --| | | (Переход в интерфейс роли) | | +---------------------+ +------------------------+ +--------------------------+

2. Криптографические алгоритмы защиты паролей

Золотое правило современной программной инженерии гласит: база данных никогда не должна знать реальный пароль пользователя. Пароль преобразуется односторонней функцией, восстановить исходный текст из которой математически невозможно за разумное время.

2.1. Почему наивное хэширование (MD5 / SHA-1) смертельно опасно

Угроза радужных таблиц (Rainbow Tables):

Если хэшировать чистый пароль через MD5("password") или SHA256("admin123"), одинаковые входные данные всегда дают строго одинаковый хэш (детерминизм). Злоумышленники заранее вычисляют таблицы соответствий для сотен миллиардов популярных паролей. Имея доступ к дампу базы данных, взлом 90% учетных записей занимает доли секунды!

2.2. Архитектура «Хэширование с солью» (SHA-256 + Salt)

Криптографическая соль (Salt) — это последовательность случайных байт (длиной не менее 16–32 байт), генерируемая криптографически стойким генератором случайных чисел (CSPRNG) персонально для каждого пользователя при регистрации или смене пароля.

Регистрация: [Пароль пользователя: "qwerty"] + [Индивидуальная соль: "k8F#9xL2!zPq"] \ / v v [Конкатенация: "qwertyk8F#9xL2!zPq"] | v [Функция SHA-256] | v [password_hash: 64 шестнадцатеричных символа (HEX)] | v Сохранение в БД: INSERT INTO users(login, salt, password_hash)

Эффект соли: даже если 1000 пользователей выберут одинаковый пароль «123456», из-за разной соли у каждого из них в базе данных будет абсолютно уникальный password_hash. Радужные таблицы становятся полностью бесполезными.

2.3. Медленные функции формирования ключа: bcrypt, Argon2, PBKDF2

Алгоритм 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) Академический стандарт для освоения алгоритмов защиты в курсах БД.

3. Проектирование структуры таблиц учетных записей

В рамках реляционной модели данных создается триада таблиц подсистемы авторизации и аудита.

-- 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);

4. Эргономика и безопасность экранных форм входа (Login Dialog UX)

Диалог входа — первое окно, с которым взаимодействует пользователь. Любая ошибка в его реализации приводит либо к краху безопасности, либо к оттоку пользователей.

4.1. Макет стандартной формы входа (Эталон)

Авторизация в системе
Неверный логин или пароль

4.2. Сравнительный анализ инженерных паттернов безопасности интерфейса

Паттерн безопасности Корректная реализация (Good UX / Secure) Опасный антипаттерн (Vulnerability)
Сообщения об ошибках Единое обобщенное сообщение: «Неверный логин или пароль». Система не сообщает, существует ли введенный логин. Детализированные подсказки: «Пользователь не существует» или «Неверный пароль к учетной записи admin» (User Enumeration).
Отображение пароля Символы маскируются маркерами (type="password") с возможностью временного просмотра по иконке глаза. Открытый текст пароля на экране, доступный стоящим за спиной людям (Shoulder Surfing).
Защита от перебора Блокировка кнопки отправки на 3 секунды после каждого неверного клика; временная блокировка аккаунта на 15 мин после 5 ошибок. Бесконечные попытки ввода без пауз и капчи, позволяющие автоматизированным скриптам перебирать пароли.
Контроль сессии Автоматический выход из системы при простое более 15 минут (Inactivity Timeout); запись в аудит факта выхода. Бессрочная авторизация на общедоступных терминалах и компьютерах общего пользования.

5. Вопросы для самопроверки студентов

  1. В чем состоит ключевое отличие понятий аутентификация и авторизация? Приведите пример для корпоративной базы данных.
  2. Почему категорически запрещено хранить пароли пользователей в таблицах базы данных в открытом (plaintext) виде?
  3. Что такое криптографическая соль (salt)? Каким образом она предотвращает взлом учетных записей с помощью предварительно вычисленных «радужных таблиц»?
  4. Какую длину в байтах и символах имеет хэш алгоритма SHA-256 в шестнадцатеричном представлении? Какой тип данных SQL оптимален для его хранения?
  5. Чем алгоритм bcrypt концептуально превосходит классический SHA-256 при хэшировании пользовательских паролей?
  6. Какое назначение выполняет атрибут is_active BOOLEAN в таблице users? Почему при увольнении сотрудника не рекомендуется выполнять запрос DELETE FROM users?
  7. Почему диалоговое окно авторизации должно выдавать нейтральное сообщение «Неверный логин или пароль», даже если учетная запись с введенным логином отсутствует в базе?
  8. Какие обязательные атрибуты должна содержать таблица журнала аудита безопасности audit_logs?