Симметричное и асимметричное шифрование

Базовая модель криптографической защиты в JOSE

Спецификация JOSE в JavaScript реализуется через библиотеку jose и охватывает три ключевых механизма: подпись (JWS), шифрование (JWE) и обмен ключами. В основе всех операций лежат два принципиально разных подхода к криптографии:

  • симметричное шифрование
  • асимметричное шифрование

Оба подхода используются в JOSE не изолированно, а как взаимодополняющие части одной системы безопасности.


Симметричное шифрование

Принцип работы

Симметричное шифрование основано на использовании одного и того же секрета для двух операций:

  • шифрование данных
  • расшифровка данных

Это означает, что обе стороны должны заранее знать общий ключ.

Формально:

ciphertext = Encrypt(plaintext, secretKey)
plaintext = Decrypt(ciphertext, secretKey)

Реализация в JOSE

В библиотеке jose симметричное шифрование используется в алгоритмах JWE, например:

  • dir (Direct Encryption)
  • A256GCM (AES-GCM с 256-битным ключом)
  • A128CBC-HS256 (комбинированный режим шифрования и HMAC)

Пример использования (Direct Encryption)

import { CompactEncrypt, compactDecrypt } from 'jose'

const key = new TextEncoder().encode('super-secret-key-32-bytes!!')

const encoded = new TextEncoder().encode('секретные данные')

const jwe = await new CompactEncrypt(encoded)
  .setProtectedHeader({ alg: 'dir', enc: 'A256GCM' })
  .encrypt(key)

const { plaintext } = await compactDecrypt(jwe, key)

console.log(new TextDecoder().decode(plaintext))

Особенности симметричного подхода

Преимущества

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

Недостатки

  • проблема распределения ключа
  • невозможность безопасного обмена через незащищённый канал
  • риск компрометации всей системы при утечке ключа

Типичные сценарии использования

Симметричное шифрование в JOSE применяется когда:

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

Асимметричное шифрование

Принцип работы

Асимметричная криптография использует пару ключей:

  • публичный ключ (public key)
  • приватный ключ (private key)

Данные, зашифрованные одним ключом, могут быть расшифрованы только другим.


Математическая модель

ciphertext = Encrypt(plaintext, publicKey)
plaintext = Decrypt(ciphertext, privateKey)

Асимметрия в JOSE

В jose асимметричные алгоритмы применяются в двух ключевых задачах:

  • защита симметрического ключа (key encryption)
  • цифровая подпись (JWS)

Основные алгоритмы

RSA

  • RSA-OAEP
  • RSA-OAEP-256

ECDH

  • ECDH-ES
  • ECDH-ES+A128KW

Пример асимметричного шифрования (RSA-OAEP)

import { generateKeyPair, CompactEncrypt, compactDecrypt } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('RSA-OAEP-256')

const message = new TextEncoder().encode('конфиденциальные данные')

const jwe = await new CompactEncrypt(message)
  .setProtectedHeader({ alg: 'RSA-OAEP-256', enc: 'A256GCM' })
  .encrypt(publicKey)

const { plaintext } = await compactDecrypt(jwe, privateKey)

console.log(new TextDecoder().decode(plaintext))

Гибридная модель шифрования

JOSE почти никогда не использует только один тип криптографии.

Вместо этого применяется гибридный подход:

  1. создаётся случайный симметричный ключ (CEK)
  2. данные шифруются симметричным алгоритмом (быстро)
  3. CEK шифруется асимметричным алгоритмом (безопасно)
  4. оба результата объединяются в JWE

Почему используется гибридная схема

  • симметричное шифрование слишком опасно для передачи ключа
  • асимметричное слишком медленное для больших данных

Гибрид объединяет:

  • скорость AES
  • безопасность RSA/ECC

Сравнение симметричного и асимметричного шифрования

Производительность

  • симметричное: очень быстрое
  • асимметричное: значительно медленнее

Управление ключами

  • симметричное: один общий секрет
  • асимметричное: пара ключей, разделение ролей

Безопасность передачи

  • симметричное: требует защищённого канала для ключа
  • асимметричное: публичный ключ можно передавать открыто

Масштабируемость

  • симметричное: плохо масштабируется при большом числе пользователей
  • асимметричное: хорошо подходит для распределённых систем

Использование в JWS (подписи)

Хотя JWS не шифрует данные, он использует ту же криптографическую модель.

Симметричная подпись

  • HS256 (HMAC SHA-256)
import { SignJWT, jwtVerify } from 'jose'

const secret = new TextEncoder().encode('shared-secret')

const token = await new SignJWT({ user: 'alice' })
  .setProtectedHeader({ alg: 'HS256' })
  .sign(secret)

const { payload } = await jwtVerify(token, secret)

Асимметричная подпись

  • RS256
  • ES256
import { generateKeyPair, SignJWT, jwtVerify } from 'jose'

const { publicKey, privateKey } = await generateKeyPair('ES256')

const token = await new SignJWT({ role: 'admin' })
  .setProtectedHeader({ alg: 'ES256' })
  .sign(privateKey)

const { payload } = await jwtVerify(token, publicKey)

Практическое разделение ролей

Симметричные алгоритмы применяются для:

  • внутреннего шифрования данных
  • высокопроизводительных сервисов
  • краткоживущих токенов

Асимметричные алгоритмы применяются для:

  • обмена ключами
  • подписи токенов
  • распределённых систем
  • микросервисной архитектуры

Внутренняя структура JWE

JWE в JOSE состоит из пяти частей:

  1. protected header
  2. encrypted key
  3. initialization vector
  4. ciphertext
  5. authentication tag

Эта структура позволяет одновременно использовать оба типа криптографии.


Роль JOSE в современных системах

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

  • совместимость с RFC 7515–7519
  • единый API для JWS и JWE
  • поддержку гибридного шифрования
  • безопасную работу с ключами

Ключевая архитектурная идея

Симметричное шифрование отвечает за скорость обработки данных.

Асимметричное шифрование отвечает за безопасное распределение доверия.

JOSE объединяет оба подхода в единую модель, где каждый компонент решает строго определённую задачу, не конкурируя с другими, а дополняя их.