Deno и его встроенная криптография

В среде выполнения Deno криптографические операции основаны на стандарте Web Crypto API, который реализован непосредственно в ядре рантайма. Это принципиально отличает его от Node.js, где исторически использовался модуль crypto с собственными абстракциями поверх OpenSSL. В Deno криптографический слой унифицирован, стандартизирован и изначально ориентирован на работу через globalThis.crypto.subtle.

Встроенный объект crypto предоставляет доступ к набору низкоуровневых примитивов:

  • генерация ключевых пар
  • хеширование данных
  • симметричное шифрование (AES-GCM и др.)
  • асимметричная криптография (RSA, ECDSA, Ed25519)
  • цифровые подписи и проверка подписей
  • экспорт и импорт ключей в стандартизированных форматах

Ключевым элементом выступает интерфейс SubtleCrypto, доступный как:

const subtle = crypto.subtle;

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

Особенности криптографической модели Deno

Криптография в Deno имеет несколько важных характеристик:

1. Изоляция и безопасность Deno по умолчанию ограничивает доступ к криптографическим операциям через систему разрешений. Хотя crypto.subtle доступен глобально, использование файловых ключей, сети и окружения требует явных флагов запуска.

2. Отсутствие нативных зависимостей Web Crypto реализован внутри самого рантайма. Это означает отсутствие привязки к OpenSSL и снижение рисков несовместимости между платформами.

3. Стандартизация API Используется спецификация W3C Web Crypto API, идентичная браузерной модели. Это позволяет переносить криптографический код между серверной и клиентской средой без изменений.

Использование криптографии Deno через библиотеку jose

Библиотека jose является одной из наиболее распространённых реализаций стандарта JOSE (JSON Object Signing and Encryption) в JavaScript. Она полностью опирается на Web Crypto API, что делает её нативно совместимой с Deno без дополнительных адаптеров.

Основные возможности:

  • JWT (JSON Web Token)
  • JWS (JSON Web Signature)
  • JWE (JSON Web Encryption)
  • JWK (JSON Web Key)
  • поддержка современных алгоритмов: ES256, RS256, EdDSA

Подпись JWT в 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.

Проверка JWT

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, RS512
  • PS256, PS384, PS512

Криптография на эллиптических кривых:

  • ES256, ES384, ES512
  • EdDSA (Ed25519, Ed448)

Генерация ключей выполняется через crypto.subtle.generateKey:

const key = await crypto.subtle.generateKey(
  { name: "ECDSA", namedCurve: "P-256" },
  true,
  ["sign", "verify"]
);

Работа с JWK (JSON Web Key)

Формат 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 для межсистемного обмена ключами, особенно в распределённых системах аутентификации.

Шифрование данных через JWE

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.

Производительность криптографии в Deno

Использование Web Crypto API даёт несколько системных преимуществ:

  • операции выполняются нативно в движке
  • отсутствуют переходы в C++ аддоны
  • асинхронная модель исключает блокировку event loop
  • поддержка аппаратного ускорения (AES-NI, ARM Crypto Extensions)

Библиотека jose не содержит собственной криптографии, поэтому производительность полностью зависит от реализации Web Crypto в Deno, которая оптимизирована на уровне рантайма.

Совместимость jose между Deno и браузером

Одним из ключевых свойств является полная переносимость кода:

  • одинаковый API crypto.subtle
  • идентичные алгоритмы
  • отсутствие платформенных различий в jose

Это позволяет использовать одну и ту же реализацию JWT как на сервере (Deno), так и на клиенте (браузер), без изменения логики криптографии.

Ограничения криптографической модели Deno

Несмотря на стандартизацию, существуют ограничения:

  • отсутствие доступа к некоторым legacy-алгоритмам
  • строгая зависимость от async API
  • невозможность синхронных криптографических вызовов
  • необходимость явного управления форматами ключей (JWK, ArrayBuffer)

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

Интеграция jose в архитектуру Deno-приложений

В типичной архитектуре Deno-приложений jose используется в слоях:

  • аутентификация API (JWT)
  • межсервисная авторизация
  • подпись вебхуков
  • шифрование конфиденциальных payload

Криптографический слой при этом остаётся полностью отделённым от бизнес-логики, а все операции выполняются через стандартный API crypto.subtle, что снижает связанность компонентов системы.