Аудит криптографических реализаций

При использовании Web Crypto API в браузерной среде ключевым аспектом становится не только корректная реализация алгоритмов, но и способность системы сохранять предсказуемое криптографическое поведение в условиях ограниченного контроля над окружением. Аудит криптографических реализаций в этом контексте направлен на выявление логических ошибок, неправильного выбора примитивов, утечек ключевого материала и некорректного управления жизненным циклом криптографических объектов.

Web Crypto API предоставляет низкоуровневые примитивы, делегируя браузеру реализацию алгоритмов. Это означает, что разработчик не реализует криптографию самостоятельно, но полностью отвечает за композицию этих примитивов в безопасную систему.

Модель угроз в браузерной криптографии

Аудит начинается с определения модели угроз, поскольку Web Crypto API работает в среде с принципиально иными допущениями, чем серверная инфраструктура.

Ключевые угрозы:

  • выполнение кода в контексте скомпрометированной страницы (XSS)
  • доступ сторонних скриптов к API в рамках того же origin
  • утечки через небезопасное хранение ключей (localStorage, sessionStorage)
  • небезопасная сериализация криптографических материалов
  • манипуляции с состоянием приложения через DOM-инъекции
  • атаки на цепочку поставки JavaScript

Особенность Web Crypto API заключается в том, что компрометация JavaScript-контекста автоматически компрометирует криптографический слой, независимо от качества алгоритмов.

Корректность выбора криптографических примитивов

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

Web Crypto API поддерживает несколько ключевых семейств:

  • симметричное шифрование (AES-CBC, AES-GCM, AES-KW)
  • асимметричное шифрование (RSA-OAEP)
  • цифровые подписи (ECDSA, RSA-PSS)
  • обмен ключами (ECDH)
  • хэш-функции (SHA-256, SHA-384, SHA-512)

Типичная проблема заключается в использовании устаревших режимов:

  • AES-CBC без аутентификации
  • RSA-PKCS1 v1.5 вместо OAEP
  • отсутствие контроля целостности данных

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

Проверка параметров криптографических операций

Аудит включает анализ параметров, передаваемых в SubtleCrypto:

crypto.subtle.encrypt(
  {
    name: "AES-GCM",
    iv: iv
  },
  key,
  data
);

Критические точки проверки:

  • длина IV (nonce) и его уникальность
  • корректность генерации случайных значений
  • отсутствие повторного использования nonce с одним ключом
  • длина ключа (128, 192, 256 бит для AES)
  • корректность тегов аутентификации

Повторное использование IV в AES-GCM приводит к полной компрометации конфиденциальности данных, что делает данный параметр одним из наиболее критичных объектов аудита.

Качество генерации случайных чисел

Web Crypto API предоставляет криптографически стойкий генератор:

crypto.getRandomValues(new Uint8Array(16));

Аудит проверяет:

  • отсутствие fallback на Math.random()
  • отсутствие пользовательских реализаций генераторов случайных чисел
  • правильное использование getRandomValues для всех криптографических целей

Типовая ошибка — использование небезопасных источников энтропии для IV, соли или ключевого материала.

Управление ключами и их жизненным циклом

Ключи, создаваемые через Web Crypto API, могут быть:

  • извлекаемыми (extractable: true)
  • неизвлекаемыми (extractable: false)

Аудит включает анализ следующих аспектов:

  • необходимость экспортируемости ключа
  • хранение ключей вне браузерного контекста
  • использование CryptoKey без сериализации в открытый вид
  • корректное удаление ссылок на ключи

Пример генерации ключа:

crypto.subtle.generateKey(
  {
    name: "AES-GCM",
    length: 256
  },
  false,
  ["encrypt", "decrypt"]
);

Неизвлекаемые ключи уменьшают риск утечки, но не защищают от выполнения кода в том же контексте.

Ошибки сериализации и хранения ключевого материала

Web Crypto API не предназначен для прямого хранения ключей в localStorage или sessionStorage. Однако на практике часто встречаются следующие ошибки:

  • экспорт ключей в JSON без защиты
  • хранение raw buffer в IndexedDB без шифрования
  • повторный импорт ключей без проверки целостности

Аудит проверяет, не происходит ли:

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

Проверка корректности криптографических протоколов

Web Crypto API не реализует протоколы верхнего уровня, поэтому ответственность за их корректность полностью лежит на разработчике.

Типичные зоны аудита:

  • реализация протоколов обмена ключами поверх ECDH
  • корректность derivation функций (HKDF)
  • защита от replay-атак
  • наличие контекстных привязок сообщений

Пример потенциально опасной конструкции:

const sharedSecret = await crypto.subtle.deriveKey(
  {
    name: "ECDH",
    public: publicKey
  },
  privateKey,
  { name: "AES-GCM", length: 256 },
  false,
  ["encrypt", "decrypt"]
);

Аудит проверяет, используется ли дополнительное связывание контекста (например, идентификаторы сессий или nonce в derivation).

Анализ устойчивости к подмене контекста исполнения

Web Crypto API не защищает от логических атак уровня приложения. Важным аспектом аудита становится проверка:

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

Особенно критичны сценарии:

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

Проверка правильности работы с цифровыми подписями

Цифровые подписи часто используются для подтверждения целостности данных:

crypto.subtle.sign(
  {
    name: "ECDSA",
    hash: "SHA-256"
  },
  privateKey,
  data
);

Аудит включает:

  • проверку алгоритма хэширования
  • корректность сериализации подписываемых данных
  • отсутствие неоднозначности в кодировании (UTF-8 vs ArrayBuffer)
  • проверку верификации на стороне потребителя

Типовая ошибка — различие входных данных между подписанием и проверкой из-за несовпадения представлений данных.

Межбраузерные различия реализации

Хотя Web Crypto API стандартизирован, реализация может отличаться:

  • различия в поддерживаемых алгоритмах
  • различия в обработке ошибок
  • различия в поведении при некорректных параметрах

Аудит включает проверку:

  • кроссбраузерной совместимости
  • поведения в Chromium-based и Gecko-based движках
  • согласованности криптографических результатов

Утечки через побочные каналы

Хотя Web Crypto API сам по себе защищает внутренние операции, побочные каналы остаются значимой угрозой:

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

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

Ошибки обработки ошибок криптографических операций

Неправильная обработка ошибок часто приводит к утечкам информации:

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

Пример опасного поведения:

try {
  await crypto.subtle.decrypt(params, key, data);
} catch (e) {
  if (e.name === "OperationError") {
    // различающее поведение
  }
}

Аудит проверяет, не раскрывает ли система информацию о внутреннем состоянии через ошибки.

Проверка устойчивости композиции криптографических операций

В реальных приложениях Web Crypto API используется не изолированно, а в комбинациях:

  • шифрование + подпись
  • деривация ключей + шифрование
  • хэширование + HMAC

Аудит оценивает:

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

Ошибкой считается использование одного ключа для нескольких криптографических целей без строгого контроля доменов использования.

Выявление криптографического анти-паттерна «самодельная безопасность»

Даже при использовании Web Crypto API встречается попытка:

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

Аудит фиксирует такие случаи как критические, поскольку безопасность перестаёт быть свойством системы и становится предположением разработчика.

Проверка обновляемости криптографических механизмов

Криптография со временем устаревает, поэтому аудит включает оценку:

  • возможности замены алгоритмов без изменения архитектуры
  • отсутствия жёстко зашитых параметров
  • гибкости системы к переходу AES-128 → AES-256, SHA-256 → SHA-512

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