При использовании Web Crypto API в браузерной среде ключевым аспектом становится не только корректная реализация алгоритмов, но и способность системы сохранять предсказуемое криптографическое поведение в условиях ограниченного контроля над окружением. Аудит криптографических реализаций в этом контексте направлен на выявление логических ошибок, неправильного выбора примитивов, утечек ключевого материала и некорректного управления жизненным циклом криптографических объектов.
Web Crypto API предоставляет низкоуровневые примитивы, делегируя браузеру реализацию алгоритмов. Это означает, что разработчик не реализует криптографию самостоятельно, но полностью отвечает за композицию этих примитивов в безопасную систему.
Аудит начинается с определения модели угроз, поскольку Web Crypto API работает в среде с принципиально иными допущениями, чем серверная инфраструктура.
Ключевые угрозы:
Особенность Web Crypto API заключается в том, что компрометация JavaScript-контекста автоматически компрометирует криптографический слой, независимо от качества алгоритмов.
Одним из первых этапов аудита является проверка того, какие алгоритмы используются и соответствуют ли они современным стандартам.
Web Crypto API поддерживает несколько ключевых семейств:
Типичная проблема заключается в использовании устаревших режимов:
Особое внимание уделяется режимам аутентифицированного шифрования. AES-GCM считается предпочтительным вариантом, так как одновременно обеспечивает конфиденциальность и целостность.
Аудит включает анализ параметров, передаваемых в
SubtleCrypto:
crypto.subtle.encrypt(
{
name: "AES-GCM",
iv: iv
},
key,
data
);
Критические точки проверки:
Повторное использование IV в AES-GCM приводит к полной компрометации конфиденциальности данных, что делает данный параметр одним из наиболее критичных объектов аудита.
Web Crypto API предоставляет криптографически стойкий генератор:
crypto.getRandomValues(new Uint8Array(16));
Аудит проверяет:
Math.random()getRandomValues для всех
криптографических целейТиповая ошибка — использование небезопасных источников энтропии для IV, соли или ключевого материала.
Ключи, создаваемые через Web Crypto API, могут быть:
Аудит включает анализ следующих аспектов:
CryptoKey без сериализации в открытый
видПример генерации ключа:
crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
false,
["encrypt", "decrypt"]
);
Неизвлекаемые ключи уменьшают риск утечки, но не защищают от выполнения кода в том же контексте.
Web Crypto API не предназначен для прямого хранения ключей в
localStorage или sessionStorage. Однако на
практике часто встречаются следующие ошибки:
Аудит проверяет, не происходит ли:
exportKey без необходимостиWeb Crypto API не реализует протоколы верхнего уровня, поэтому ответственность за их корректность полностью лежит на разработчике.
Типичные зоны аудита:
Пример потенциально опасной конструкции:
const sharedSecret = await crypto.subtle.deriveKey(
{
name: "ECDH",
public: publicKey
},
privateKey,
{ name: "AES-GCM", length: 256 },
false,
["encrypt", "decrypt"]
);
Аудит проверяет, используется ли дополнительное связывание контекста (например, идентификаторы сессий или nonce в derivation).
Web Crypto API не защищает от логических атак уровня приложения. Важным аспектом аудита становится проверка:
Особенно критичны сценарии:
Цифровые подписи часто используются для подтверждения целостности данных:
crypto.subtle.sign(
{
name: "ECDSA",
hash: "SHA-256"
},
privateKey,
data
);
Аудит включает:
Типовая ошибка — различие входных данных между подписанием и проверкой из-за несовпадения представлений данных.
Хотя Web Crypto API стандартизирован, реализация может отличаться:
Аудит включает проверку:
Хотя Web Crypto API сам по себе защищает внутренние операции, побочные каналы остаются значимой угрозой:
Аудит оценивает, может ли наблюдатель извне получить информацию о данных через косвенные признаки.
Неправильная обработка ошибок часто приводит к утечкам информации:
Пример опасного поведения:
try {
await crypto.subtle.decrypt(params, key, data);
} catch (e) {
if (e.name === "OperationError") {
// различающее поведение
}
}
Аудит проверяет, не раскрывает ли система информацию о внутреннем состоянии через ошибки.
В реальных приложениях Web Crypto API используется не изолированно, а в комбинациях:
Аудит оценивает:
Ошибкой считается использование одного ключа для нескольких криптографических целей без строгого контроля доменов использования.
Даже при использовании Web Crypto API встречается попытка:
Аудит фиксирует такие случаи как критические, поскольку безопасность перестаёт быть свойством системы и становится предположением разработчика.
Криптография со временем устаревает, поэтому аудит включает оценку:
Системы, в которых алгоритмы зафиксированы на уровне бизнес-логики, считаются потенциально уязвимыми в долгосрочной перспективе.