Симметричное шифрование против одностороннего хеширования

Симметричное шифрование и одностороннее хеширование решают принципиально разные задачи в области безопасности данных. Несмотря на внешнюю схожесть — преобразование входных данных в нечитабельный вид — их свойства, цели и способы применения существенно различаются.


Симметричное шифрование

Симметричное шифрование — это метод, при котором один и тот же ключ используется как для шифрования, так и для расшифрования данных.

Ключевые характеристики:

  • Обратимость: зашифрованные данные можно восстановить в исходный вид при наличии ключа.
  • Секретность ключа: безопасность полностью зависит от сохранности ключа.
  • Высокая производительность: подходит для обработки больших объёмов данных.

Принцип работы:

  1. Исходные данные (plaintext) подаются на вход алгоритму.
  2. Применяется секретный ключ.
  3. Получается зашифрованный текст (ciphertext).
  4. Для восстановления используется тот же ключ.

Популярные алгоритмы:

  • 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

  1. Генерация соли:

    const salt = bcrypt.genSaltSync(10);
  2. Хеширование пароля:

    const hash = bcrypt.hashSync(password, salt);
  3. Проверка:

    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 — инструмент для невосстановимого преобразования с целью проверки подлинности.

Эти подходы не конкурируют, а дополняют друг друга, применяясь в разных слоях системы безопасности.