Поддержка браузерами и средами выполнения

Web Crypto API реализуется через объект crypto и его интерфейс subtle, однако уровень поддержки существенно зависит от браузера, версии движка и контекста выполнения кода. Несмотря на стандартизацию W3C, поведение и доступность отдельных возможностей остаются неоднородными.


Поддержка в основных браузерах

Современные браузеры на Chromium (Google Chrome, Microsoft Edge, Opera, Brave) Поддержка Web Crypto API считается полной и стабильной начиная с относительно ранних версий Chromium. Доступны:

  • crypto.getRandomValues
  • crypto.subtle (SubtleCrypto)
  • все основные алгоритмы: AES, RSA, ECDSA, ECDH, SHA-1/256/384/512

Особенности:

  • API доступен только в secure context (HTTPS или localhost)
  • реализация оптимизирована через нативные криптографические библиотеки ОС
  • высокая производительность операций импорта/экспорта ключей

Mozilla Firefox Firefox также предоставляет полноценную реализацию Web Crypto API, начиная с версии, где SubtleCrypto стал стабильной частью платформы.

Особенности:

  • поддержка большинства алгоритмов соответствует спецификации W3C
  • некоторые экспериментальные алгоритмы могут отличаться по доступности или требовать флагов
  • поведение строго соответствует secure context модели

Safari (WebKit) Safari поддерживает Web Crypto API, но исторически имел ряд ограничений.

Особенности:

  • полная поддержка SubtleCrypto присутствует в современных версиях Safari (iOS и macOS)
  • более позднее внедрение некоторых алгоритмов по сравнению с Chromium/Firefox
  • ограничения на отдельные режимы экспорта ключей в старых версиях

Internet Explorer Web Crypto API отсутствует полностью. Используется устаревший API msCrypto, не совместимый со стандартом.


Требование secure context

Ключевое ограничение платформенной реализации — обязательное выполнение в защищённом контексте.

Web Crypto API доступен только при условиях:

  • HTTPS
  • localhost (локальная разработка)
  • некоторые file:// сценарии в ограниченных условиях (нестабильно и не рекомендуется)

Если страница загружена через HTTP, объект crypto.subtle будет недоступен, даже если браузер его поддерживает.


Поддержка в Web Workers и Service Workers

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

Web Workers

  • crypto.subtle доступен без ограничений
  • используется для разгрузки CPU-интенсивных операций (например, PBKDF2 или RSA)

Service Workers

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

Особенность: в worker-контекстах отсутствует DOM, но crypto полностью доступен.


Node.js и Web Crypto API

Ситуация в Node.js отличается эволюцией API.

Node.js до 15 версии

  • Web Crypto API отсутствует как стандартный интерфейс
  • используется модуль crypto

Node.js 15+

  • появляется экспериментальная поддержка crypto.webcrypto

Node.js 16+

  • Web Crypto API становится стабильной частью через:

    globalThis.crypto.subtle

Node.js 18+ и выше

  • Web Crypto API интегрирован в runtime как стандарт
  • доступен без дополнительных импортов

Особенности реализации Node.js:

  • используется OpenSSL вместо браузерных криптобиблиотек
  • поведение алгоритмов может отличаться в edge-case сценариях
  • часть алгоритмов может зависеть от версии OpenSSL

Deno

Deno изначально проектировался с нативной поддержкой Web API, поэтому Web Crypto API реализован полностью.

Особенности:

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

Bun

Bun также поддерживает Web Crypto API.

Особенности:

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

React Native и гибридные среды

В React Native Web Crypto API отсутствует как системный стандарт.

Возможные подходы:

  • использование полифиллов (react-native-webcrypto)
  • нативные модули (Objective-C / Java / Kotlin bindings)
  • частичная поддержка через JavaScriptCore или Hermes с ограничениями

Ограничения:

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

Electron

Electron предоставляет Web Crypto API через Chromium-движок.

Особенности:

  • поведение идентично браузеру Chromium
  • доступ в renderer-процессах
  • в main-процессе используется Node.js crypto API, который может отличаться

Проверка доступности API

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

if (globalThis.crypto && crypto.subtle) {
  // Web Crypto API доступен
}

Дополнительно учитывается secure context:

if (globalThis.isSecureContext) {
  // гарантированная доступность crypto.subtle в браузерах
}

Различия реализации между средами

Несмотря на единый стандарт, наблюдаются системные расхождения:

  • Алгоритмы: не все реализации поддерживают одинаковый набор (особенно в старых Safari и Node.js через OpenSSL)
  • Производительность: Chromium и Node.js обычно быстрее в RSA и AES операциях
  • Форматы ключей: экспорт/импорт может отличаться в нюансах DER/SPKI/PKCS8
  • PBKDF2 и scrypt: поведение итераций и лимитов иногда варьируется

Ограничения в старых версиях браузеров

Ранние версии реализации Web Crypto API имели неполный функционал:

  • отсутствие ECDSA или ECDH
  • ограниченный набор хэш-функций
  • нестабильная работа AES-GCM
  • неполная реализация exportKey и importKey

В современных версиях эти ограничения в основном устранены.


Итоговая картина совместимости

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

  • браузеры Chromium и Firefox обеспечивают наиболее стабильную реализацию
  • Safari догоняет стандарт, но сохраняет исторические отличия
  • Node.js, Deno и Bun предоставляют серверные реализации с различиями в криптографических backend
  • старые браузеры и React Native требуют полифиллов или альтернативных решений