Web Crypto API доступен только в защищённых контекстах, и это одно из ключевых ограничений, определяющих его архитектуру и модель безопасности. Ограничение связано не с особенностями JavaScript, а с политиками браузеров, которые жёстко отделяют криптографические операции от потенциально небезопасной среды выполнения.
Защищённый контекст (secure context) — это среда, в которой браузер гарантирует целостность и конфиденциальность передаваемых данных. В таких условиях разрешается доступ к чувствительным API, включая Web Crypto API.
К защищённым контекстам относятся:
Любой другой источник, включая HTTP, рассматривается как потенциально небезопасный.
Проверка выполняется через встроенное свойство:
window.isSecureContext
Если значение false, доступ к crypto.subtle
будет недоступен.
Web Crypto API работает с криптографическими примитивами: генерацией ключей, подписью, шифрованием и хешированием. Эти операции предполагают, что входные данные и результаты не будут скомпрометированы.
Использование в небезопасной среде нарушает базовые свойства криптографии:
Если код может быть изменён до выполнения, криптографическая защита теряет смысл.
HTTPS обеспечивает два ключевых свойства:
Это означает, что код, загружаемый по HTTPS, не может быть незаметно изменён в пути между сервером и клиентом.
Web Crypto API требует именно этого уровня гарантии, поскольку:
При попытке обращения к crypto.subtle в небезопасной
среде происходит одно из следующих:
crypto.subtle равно
undefined;crypto.Пример:
if (!window.isSecureContext) {
console.log("Web Crypto недоступен");
}
Локальные адреса рассматриваются как доверенные:
http://localhosthttp://127.0.0.1http://[::1]Это сделано для упрощения разработки, поскольку локальная среда считается изолированной от внешнего сетевого трафика.
Однако даже в этом случае поведение может различаться:
Открытие HTML-файлов напрямую через файловую систему
(file://) не создаёт полноценного происхождения (origin). В
результате:
В современных реализациях чаще всего доступ блокируется полностью.
Корректная проверка включает несколько уровней:
const isCryptoAvailable =
window.isSecureContext &&
typeof window.crypto !== "undefined" &&
typeof window.crypto.subtle !== "undefined";
Даже при наличии crypto объект subtle
является основным индикатором поддержки криптографических операций.
Даже при использовании HTTPS-страницы доступ к Web Crypto API может быть косвенно ограничен при нарушении политики mixed content.
Mixed content возникает, когда:
Хотя сам Web Crypto API не блокируется напрямую, подмена скриптов через HTTP-ресурсы может привести к компрометации логики, использующей криптографию.
Web Crypto API строго привязан к origin. Origin определяется комбинацией:
Ключи, созданные через crypto.subtle.generateKey,
привязаны к origin и не могут быть использованы в другом источнике.
Это обеспечивает:
const key = await crypto.subtle.generateKey(
{
name: "AES-GCM",
length: 256
},
true,
["encrypt", "decrypt"]
);
Данная операция выполняется только при соблюдении условий secure context. В противном случае вызов завершится ошибкой.
Service Worker также подчиняется правилам secure context. Даже если он перехватывает запросы HTTPS-страницы, сам worker должен быть зарегистрирован из безопасного источника.
Ограничение распространяется на:
Все они наследуют контекст происхождения основной страницы.
Web Crypto API проектировался с учётом угроз:
Любая из этих атак делает криптографические операции бессмысленными, если отсутствует гарантия целостности кода.
Размещение криптографической логики в веб-приложении требует обязательного соблюдения следующих условий:
Эти ограничения являются частью модели безопасности браузера и не могут быть обойдены средствами JavaScript.
Несмотря на единый стандарт W3C, реализация secure context может немного отличаться:
Однако во всех современных версиях поведение в целом согласовано.
Встроенные проверки позволяют учитывать ограничения ещё на этапе инициализации:
function initCrypto() {
if (!window.isSecureContext || !crypto.subtle) {
throw new Error("Web Crypto API недоступен");
}
}
Такая проверка становится стандартной частью архитектуры приложений, использующих криптографию в браузере.
Web Crypto API работает в связке с другими механизмами:
Каждый из этих уровней усиливает изоляцию криптографических операций, снижая вероятность компрометации.
Ограничение на использование Web Crypto API вне HTTPS не является формальностью. Оно формирует базовый уровень доверия к среде выполнения, без которого криптографические операции теряют смысл.
Secure context становится фундаментом, на котором строится вся модель безопасности API, включая генерацию ключей, шифрование и цифровые подписи.