EdDSA: Ed25519 и Ed448

EdDSA (Edwards-curve Digital Signature Algorithm) в контексте JOSE используется как алгоритм цифровой подписи с детерминированной схемой, основанный на эллиптических кривых Эдвардса. В спецификации JOSE он обозначается единым идентификатором EdDSA, при этом конкретная кривая определяется параметрами ключа: Ed25519 или Ed448.

Библиотека jose в JavaScript реализует поддержку EdDSA через Web Crypto API (в Node.js — через встроенный crypto), обеспечивая работу с JWK (JSON Web Key), JWS (JSON Web Signature) и JWT.


Ed25519 и Ed448: различия в криптографической основе

Обе схемы относятся к семейству EdDSA, но различаются параметрами кривой и уровнем криптографической стойкости.

Ed25519

  • Основан на кривой Curve25519 (edwards25519)
  • Длина ключа: 256 бит
  • Подпись: 64 байта
  • Высокая производительность
  • Широко используется в JWT, SSH, TLS

Ed448

  • Основан на кривой Curve448 (edwards448)
  • Длина ключа: 456 бит
  • Подпись: 114 байт
  • Более высокий уровень безопасности (в ущерб скорости)
  • Используется в системах с повышенными требованиями к стойкости

В JOSE оба алгоритма маркируются как EdDSA, поэтому различие определяется через поле crv в JWK:

  • "crv": "Ed25519"
  • "crv": "Ed448"

Генерация ключей EdDSA в jose

Библиотека jose предоставляет унифицированный API для генерации ключевых пар.

Ed25519

import { generateKeyPair } from 'jose';

const { publicKey, privateKey } = await generateKeyPair('EdDSA', {
  crv: 'Ed25519'
});

Ed448

import { generateKeyPair } from 'jose';

const { publicKey, privateKey } = await generateKeyPair('EdDSA', {
  crv: 'Ed448'
});

Сгенерированные ключи являются объектами CryptoKey (в Node.js — через WebCrypto слой), совместимыми с JWS операциями.


Представление ключей в формате JWK

JOSE использует JSON Web Key для хранения и передачи криптографических ключей.

Пример JWK для Ed25519

{
  "kty": "OKP",
  "crv": "Ed25519",
  "x": "base64url-public-key",
  "d": "base64url-private-key"
}

Пример JWK для Ed448

{
  "kty": "OKP",
  "crv": "Ed448",
  "x": "base64url-public-key",
  "d": "base64url-private-key"
}

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

  • kty всегда равен OKP (Octet Key Pair)
  • crv определяет конкретную кривую
  • x — публичный ключ
  • d — приватный ключ (только для private JWK)

Подпись данных с использованием EdDSA

В JOSE подпись обычно применяется к JWT (JSON Web Token). Алгоритм всегда указывается как EdDSA, а тип кривой определяется ключом.

Создание JWT с Ed25519

import { SignJWT } from 'jose';

const jwt = await new SignJWT({ role: 'admin' })
  .setProtectedHeader({ alg: 'EdDSA' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .sign(privateKey);

Создание JWT с Ed448

const jwt = await new SignJWT({ role: 'admin' })
  .setProtectedHeader({ alg: 'EdDSA' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .sign(privateKey);

В обоих случаях алгоритм в заголовке одинаков, различие определяется ключом.


Проверка подписи JWT

Проверка выполняется через jwtVerify, где используется публичный ключ.

import { jwtVerify } from 'jose';

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

Процесс включает:

  • декодирование заголовка JWT
  • выбор алгоритма EdDSA
  • проверку подписи через соответствующую кривую (Ed25519 или Ed448)

Импорт и экспорт ключей

Экспорт в JWK

import { exportJWK } from 'jose';

const jwk = await exportJWK(publicKey);

Импорт из JWK

import { importJWK } from 'jose';

const key = await importJWK(jwk, 'EdDSA');

При импорте важно наличие поля crv, иначе ключ не будет интерпретирован корректно.


Использование PEM и конвертация

Хотя JOSE ориентирован на JWK, библиотека поддерживает работу с PEM через промежуточные преобразования.

import { importSPKI, importPKCS8 } from 'jose';

const publicKey = await importSPKI(pemPublicKey, 'EdDSA');
const privateKey = await importPKCS8(pemPrivateKey, 'EdDSA');

Для Ed25519 и Ed448 PEM-форматы могут различаться в зависимости от генератора ключей, но JOSE абстрагирует криптографическую реализацию.


Алгоритмическая модель EdDSA в JOSE

Внутри реализации используется детерминированная схема подписи:

  • отсутствие случайности в генерации nonce
  • использование хэш-функций (SHA-512 для Ed25519)
  • защита от атак на плохой RNG

В JOSE это полностью скрыто за API Web Crypto.


Особенности безопасности Ed25519 и Ed448

Ed25519

  • оптимален для массовых систем
  • широко протестирован
  • стандарт де-факто для JWT-систем

Ed448

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

Ключевой момент: в JOSE нет выбора алгоритма через строку alg — всегда используется EdDSA, поэтому безопасность определяется только кривой ключа.


Производительность и практическое применение

Ed25519 демонстрирует высокую скорость подписи и проверки, что делает его предпочтительным для:

  • микросервисной архитектуры
  • высоконагруженных API
  • JWT-аутентификации

Ed448 применяется в сценариях:

  • долгосрочной криптографической защиты
  • системах с повышенными требованиями к стойкости
  • архивных или критически важных данных

В библиотеке jose обе реализации оптимизированы через системные криптографические примитивы, поэтому разница в производительности проявляется только на уровне кривой, а не JS-кода.