Детерминированное шифрование и его риски

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

Web Crypto API (WebCrypto) изначально ориентирован на вероятностное (недетерминированное) шифрование, где каждый вызов шифрования с одним и тем же ключом и одинаковыми данными даёт различный результат за счёт случайного вектора инициализации (IV/nonce). Это ключевая часть модели безопасности современных режимов, таких как AES-GCM.

В WebCrypto шифрование реализуется через SubtleCrypto.encrypt. Типичный пример AES-GCM:

const key = await crypto.subtle.generateKey(
  { name: "AES-GCM", length: 256 },
  true,
  ["encrypt", "decrypt"]
);

const iv = crypto.getRandomValues(new Uint8Array(12));

const ciphertext = await crypto.subtle.encrypt(
  { name: "AES-GCM", iv },
  key,
  new TextEncoder().encode("secret data")
);

Ключевой элемент здесь — iv. Он обязан быть уникальным для каждого шифрования с одним и тем же ключом. Именно он делает результат недетерминированным.

Если убрать случайность IV и использовать фиксированное значение, система становится детерминированной, но одновременно теряет криптографическую стойкость.

Что происходит при детерминированном шифровании

Детерминированное шифрование означает:

  • одинаковый вход → одинаковый выход
  • отсутствие случайности в процессе шифрования
  • возможность сравнивать шифртексты напрямую

На практике это достигается либо:

  • фиксацией IV (что критически опасно для режимов вроде GCM)
  • использованием режимов без случайности (например, ECB, который в WebCrypto не предоставляется напрямую)
  • построением поверх WebCrypto собственных схем, убирающих рандомизацию

Почему WebCrypto не предлагает “детерминированный AES-GCM”

AES-GCM специально разработан как режим аутентифицированного шифрования с обязательным уникальным nonce. Его безопасность формально опирается на предположение:

nonce никогда не повторяется для одного ключа

Если использовать фиксированный IV:

const iv = new Uint8Array(12); // все нули

то возникает ряд проблем:

  • одинаковые сообщения дают одинаковые шифртексты
  • возможна утечка повторяющихся структур данных
  • снижается стойкость к атаке по выбранному открытому тексту
  • нарушается аутентификационная гарантия GCM при повторе nonce

Фактически это превращает систему в криптографически небезопасную.

Детерминизм и утечка информации

Главная проблема детерминированного шифрования — утечка равенства.

Даже если сам текст неизвестен, наблюдатель получает информацию:

  • два шифртекста идентичны → исходные сообщения идентичны
  • частотные паттерны сохраняются
  • возможна реконструкция распределений данных

Это особенно опасно в контексте:

  • баз данных (например, поля email, phone)
  • поиска по зашифрованным данным
  • индексации

Пример: если зашифровать список пользователей, то одинаковые email будут давать одинаковые шифртексты, позволяя восстановить статистику активности.

Попытки детерминированного шифрования в WebCrypto

В WebCrypto отсутствует полноценная поддержка схем вроде:

  • AES-SIV
  • AES-GCM-SIV

Эти режимы специально разработаны для “безопасного детерминизма”, где одинаковый вход даёт одинаковый выход, но при этом сохраняется устойчивость к ошибкам использования nonce.

Поэтому разработчики иногда пытаются эмулировать детерминированность через:

1. Фиксированный IV (опасный подход)

const iv = new Uint8Array(12); // всегда нули

Результат:

  • предсказуемость
  • утрата семантической безопасности
  • уязвимость к повторному использованию ключа

2. Производный IV из данных

const iv = crypto.subtle.digest("SHA-256", data)

Проблема:

  • IV становится зависимым от открытого текста
  • возникает утечка структуры входных данных
  • возможны коллизии и предсказуемость

3. Использование HMAC как “псевдо-шифрования”

Иногда вместо шифрования используют:

HMAC(key, data)

Но это уже не шифрование, а MAC:

  • нет восстановления исходного текста
  • невозможно расшифрование
  • применимо только для проверки целостности

Криптографические последствия детерминизма

Детерминированное шифрование ломает ключевое свойство современных схем — semantic security (IND-CPA).

При нарушении этого свойства атакующий получает возможность:

  • отличать зашифрованные сообщения
  • строить словари соответствий
  • выполнять офлайн-атаки по известным значениям

Особенно опасны сценарии, где атакующий может наблюдать множество шифртекстов и сравнивать их между собой.

Проблема повторного использования ключей

В недетерминированных схемах ошибка часто компенсируется случайностью IV.

В детерминированной схеме любой повтор:

  • одинакового ключа
  • одинакового сообщения

приводит к идентичному шифртексту, что делает компрометацию данных системной, а не локальной.

Поиск по зашифрованным данным как причина детерминизма

Основной мотив использования детерминированного шифрования — возможность выполнять:

  • точное сравнение
  • фильтрацию
  • индексирование

например:

  • поиск email в базе
  • проверка уникальности телефона
  • дедупликация записей

Однако в WebCrypto это приводит к необходимости внешних компромиссов:

  • отказ от AES-GCM в пользу небезопасных схем
  • построение отдельного слоя индексирования
  • использование токенизации вместо шифрования

Альтернативный подход: токенизация вместо детерминизма

Вместо детерминированного шифрования часто используется:

  • генерация случайного токена
  • хранение соответствия в защищённой базе

Это позволяет:

  • сохранить криптографическую стойкость
  • избежать утечки равенства
  • отделить поиск от шифрования

Ошибки проектирования при попытке детерминизма

На практике наиболее частые ошибки:

  • повторное использование IV в AES-GCM
  • попытка убрать случайность ради “удобства сравнения”
  • использование SHA-хеша вместо шифрования
  • смешивание MAC и encryption логики

Каждая из этих ошибок приводит к разным, но критическим последствиям — от утечки структуры данных до полной компрометации ключа.

Свойства, которые теряются при детерминизме

При переходе к детерминированному шифрованию исчезают:

  • семантическая безопасность
  • защита от анализа повторов
  • устойчивость к частотному анализу
  • скрытие структуры данных

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

Практическое положение в WebCrypto

В рамках Web Crypto API корректная модель выглядит так:

  • AES-GCM используется только с уникальным IV
  • IV генерируется через crypto.getRandomValues
  • детерминизм считается анти-паттерном
  • любые попытки его реализации требуют внешней криптосистемы

Любое отклонение от этого приводит к деградации модели безопасности ниже уровня, для которого WebCrypto вообще проектировался.