Симметричное шифрование и одностороннее хеширование решают
принципиально разные задачи в области безопасности данных. Несмотря на
внешнюю схожесть — преобразование входных данных в нечитабельный вид —
их свойства, цели и способы применения существенно различаются.
Симметричное шифрование
Симметричное шифрование — это метод, при котором
один и тот же ключ используется как для шифрования, так и для
расшифрования данных.
Ключевые характеристики:
- Обратимость: зашифрованные данные можно
восстановить в исходный вид при наличии ключа.
- Секретность ключа: безопасность полностью зависит
от сохранности ключа.
- Высокая производительность: подходит для обработки
больших объёмов данных.
Принцип работы:
- Исходные данные (plaintext) подаются на вход алгоритму.
- Применяется секретный ключ.
- Получается зашифрованный текст (ciphertext).
- Для восстановления используется тот же ключ.
Популярные алгоритмы:
- AES (Advanced Encryption Standard)
- DES / 3DES
- ChaCha20
Пример использования:
- Шифрование файлов
- Защита сетевого трафика (например, TLS на низком уровне)
- Хранение конфиденциальных данных с возможностью расшифровки
Одностороннее хеширование
Хеширование — это процесс преобразования данных
произвольной длины в строку фиксированного размера (хеш), при этом
восстановление исходных данных невозможно.
Ключевые характеристики:
- Необратимость: невозможно получить исходные данные
из хеша.
- Детерминированность: одинаковый ввод всегда даёт
одинаковый результат.
- Чувствительность к изменениям: малейшее изменение
входных данных полностью меняет хеш.
- Фиксированная длина результата
Примеры алгоритмов:
- SHA-256
- SHA-512
- bcrypt
- scrypt
- Argon2
Особенности bcrypt.js
Библиотека bcrypt.js реализует алгоритм bcrypt на
JavaScript и используется для безопасного хранения паролей.
Основные свойства bcrypt:
- Адаптивность: возможность увеличивать сложность
(cost factor)
- Соль (salt) встроена в алгоритм
- Замедление вычислений: защита от перебора
(brute-force)
Почему bcrypt — не шифрование:
- Пароль не расшифровывается, а сравнивается через
повторное хеширование
- Нет ключа для восстановления исходного значения
- Это строго односторонняя функция
Сравнение подходов
| Характеристика |
Симметричное шифрование |
Хеширование (bcrypt) |
| Обратимость |
Да |
Нет |
| Назначение |
Скрытие данных |
Проверка целостности / паролей |
| Использование ключа |
Да |
Нет |
| Возможность восстановления |
Да |
Нет |
| Устойчивость к перебору |
Зависит от реализации |
Высокая (за счёт cost) |
Почему bcrypt применяется
для паролей
Хранение паролей в зашифрованном виде — ошибка архитектуры. Если
используется симметричное шифрование:
- при компрометации ключа раскрываются все пароли
- появляется единая точка отказа
bcrypt решает эти проблемы:
- пароли не хранятся в исходном виде
- невозможно восстановить пароль даже при утечке базы
- атака требует перебора каждого пароля отдельно
Механизм работы bcrypt
Генерация соли:
const salt = bcrypt.genSaltSync(10);
Хеширование пароля:
const hash = bcrypt.hashSync(password, salt);
Проверка:
bcrypt.compareSync(password, hash);
Что входит в хеш:
- версия алгоритма
- стоимость (cost factor)
- соль
- результат хеширования
Пример:
$2a$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36s4z3d1d7xY8Yk5Pz5e9iG
Ключевые различия на
уровне архитектуры
1. Цель применения
- Шифрование — защита данных при передаче или хранении
- Хеширование — подтверждение подлинности данных
2. Работа с секретами
- Шифрование требует хранения ключа
- bcrypt не требует хранения секретов
3. Угрозы
- Шифрование уязвимо к утечке ключа
- bcrypt уязвим только к вычислительным атакам
Практические сценарии
Когда использовать
шифрование:
- передача данных между сервисами
- хранение токенов, которые нужно расшифровать
- защита конфиденциальных файлов
Когда использовать bcrypt:
- хранение паролей пользователей
- проверка аутентификации
- защита от атак перебора
Ошибки в использовании
Неправильно:
// Шифрование пароля (ошибка)
const encrypted = encrypt(password, key);
Правильно:
// Хеширование пароля
const hash = bcrypt.hashSync(password, 12);
Влияние стоимости (cost
factor)
bcrypt позволяет настраивать сложность:
bcrypt.hashSync(password, 12);
- Чем выше значение — тем медленнее вычисление
- Повышает защиту от brute-force
- Увеличивает нагрузку на сервер
Рекомендуемые значения:
- 10–12 для большинства приложений
- 12–14 для повышенной безопасности
Роль соли (salt)
Соль предотвращает:
- атаки по радужным таблицам
- совпадение хешей одинаковых паролей
bcrypt автоматически:
- генерирует соль
- включает её в итоговый хеш
Итоговое разграничение
Симметричное шифрование — инструмент для скрытия информации с
возможностью восстановления. bcrypt — инструмент для
невосстановимого преобразования с целью проверки
подлинности.
Эти подходы не конкурируют, а дополняют друг друга, применяясь в
разных слоях системы безопасности.