В среде выполнения Deno криптографические операции основаны на
стандарте Web Crypto API, который реализован непосредственно в ядре
рантайма. Это принципиально отличает его от Node.js, где исторически
использовался модуль crypto с собственными абстракциями
поверх OpenSSL. В Deno криптографический слой унифицирован,
стандартизирован и изначально ориентирован на работу через
globalThis.crypto.subtle.
Встроенный объект crypto предоставляет доступ к набору
низкоуровневых примитивов:
Ключевым элементом выступает интерфейс SubtleCrypto,
доступный как:
const subtle = crypto.subtle;
Именно он используется всеми современными библиотеками, включая
jose, которая строится поверх Web Crypto API без
необходимости в нативных биндингах.
Криптография в Deno имеет несколько важных характеристик:
1. Изоляция и безопасность Deno по умолчанию
ограничивает доступ к криптографическим операциям через систему
разрешений. Хотя crypto.subtle доступен глобально,
использование файловых ключей, сети и окружения требует явных флагов
запуска.
2. Отсутствие нативных зависимостей Web Crypto реализован внутри самого рантайма. Это означает отсутствие привязки к OpenSSL и снижение рисков несовместимости между платформами.
3. Стандартизация API Используется спецификация W3C Web Crypto API, идентичная браузерной модели. Это позволяет переносить криптографический код между серверной и клиентской средой без изменений.
Библиотека jose является одной из наиболее
распространённых реализаций стандарта JOSE (JSON Object Signing and
Encryption) в JavaScript. Она полностью опирается на Web Crypto API, что
делает её нативно совместимой с Deno без дополнительных адаптеров.
Основные возможности:
import { SignJWT } from "https://deno.land/x/jose/mod.ts";
const secret = crypto.getRandomValues(new Uint8Array(32));
const jwt = await new SignJWT({ role: "admin" })
.setProtectedHeader({ alg: "HS256" })
.setIssuedAt()
.setExpirationTime("2h")
.sign(secret);
В данном случае используется встроенный
crypto.getRandomValues, а криптографическая операция
подписи выполняется через SubtleCrypto.sign.
import { jwtVerify } from "https://deno.land/x/jose/mod.ts";
const { payload } = await jwtVerify(jwt, secret);
console.log(payload.role);
Функция jwtVerify делегирует проверку подписи Web Crypto
API, исключая необходимость внешних криптографических библиотек.
Deno через Web Crypto поддерживает широкий набор алгоритмов, которые напрямую используются jose:
Симметричные:
HS256, HS384, HS512Асимметричные:
RS256, RS384, RS512PS256, PS384, PS512Криптография на эллиптических кривых:
ES256, ES384, ES512EdDSA (Ed25519, Ed448)Генерация ключей выполняется через
crypto.subtle.generateKey:
const key = await crypto.subtle.generateKey(
{ name: "ECDSA", namedCurve: "P-256" },
true,
["sign", "verify"]
);
Формат JWK используется для стандартизированного представления ключей.
Экспорт ключа:
const jwk = await crypto.subtle.exportKey("jwk", key.privateKey);
Импорт:
const imported = await crypto.subtle.importKey(
"jwk",
jwk,
{ name: "ECDSA", namedCurve: "P-256" },
true,
["sign"]
);
Библиотека jose активно использует JWK для межсистемного обмена ключами, особенно в распределённых системах аутентификации.
Deno позволяет использовать шифрование сообщений через JWE:
import { CompactEncrypt } from "https://deno.land/x/jose/mod.ts";
const encoder = new TextEncoder();
const encrypted = await new CompactEncrypt(
encoder.encode("секретное сообщение")
)
.setProtectedHeader({ alg: "A256GCMKW", enc: "A256GCM" })
.encrypt(key);
Шифрование выполняется через AES-GCM, реализованный в
crypto.subtle.encrypt.
Использование Web Crypto API даёт несколько системных преимуществ:
Библиотека jose не содержит собственной криптографии, поэтому производительность полностью зависит от реализации Web Crypto в Deno, которая оптимизирована на уровне рантайма.
Одним из ключевых свойств является полная переносимость кода:
crypto.subtleЭто позволяет использовать одну и ту же реализацию JWT как на сервере (Deno), так и на клиенте (браузер), без изменения логики криптографии.
Несмотря на стандартизацию, существуют ограничения:
Эти ограничения являются следствием следования стандарту Web Crypto API и направлены на унификацию модели безопасности.
В типичной архитектуре Deno-приложений jose используется в слоях:
Криптографический слой при этом остаётся полностью отделённым от
бизнес-логики, а все операции выполняются через стандартный API
crypto.subtle, что снижает связанность компонентов
системы.