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+
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 требуют полифиллов или альтернативных
решений