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.
Обе схемы относятся к семейству EdDSA, но различаются параметрами кривой и уровнем криптографической стойкости.
Ed25519
Ed448
В JOSE оба алгоритма маркируются как EdDSA, поэтому
различие определяется через поле crv в JWK:
"crv": "Ed25519""crv": "Ed448"Библиотека jose предоставляет унифицированный API для
генерации ключевых пар.
import { generateKeyPair } from 'jose';
const { publicKey, privateKey } = await generateKeyPair('EdDSA', {
crv: 'Ed25519'
});
import { generateKeyPair } from 'jose';
const { publicKey, privateKey } = await generateKeyPair('EdDSA', {
crv: 'Ed448'
});
Сгенерированные ключи являются объектами CryptoKey (в Node.js — через WebCrypto слой), совместимыми с JWS операциями.
JOSE использует JSON Web Key для хранения и передачи криптографических ключей.
{
"kty": "OKP",
"crv": "Ed25519",
"x": "base64url-public-key",
"d": "base64url-private-key"
}
{
"kty": "OKP",
"crv": "Ed448",
"x": "base64url-public-key",
"d": "base64url-private-key"
}
Особенности:
kty всегда равен OKP (Octet Key Pair)crv определяет конкретную кривуюx — публичный ключd — приватный ключ (только для private JWK)В JOSE подпись обычно применяется к JWT (JSON Web Token). Алгоритм
всегда указывается как EdDSA, а тип кривой определяется
ключом.
import { SignJWT } from 'jose';
const jwt = await new SignJWT({ role: 'admin' })
.setProtectedHeader({ alg: 'EdDSA' })
.setIssuedAt()
.setExpirationTime('2h')
.sign(privateKey);
const jwt = await new SignJWT({ role: 'admin' })
.setProtectedHeader({ alg: 'EdDSA' })
.setIssuedAt()
.setExpirationTime('2h')
.sign(privateKey);
В обоих случаях алгоритм в заголовке одинаков, различие определяется ключом.
Проверка выполняется через jwtVerify, где используется
публичный ключ.
import { jwtVerify } from 'jose';
const { payload } = await jwtVerify(token, publicKey);
Процесс включает:
EdDSAimport { exportJWK } from 'jose';
const jwk = await exportJWK(publicKey);
import { importJWK } from 'jose';
const key = await importJWK(jwk, 'EdDSA');
При импорте важно наличие поля crv, иначе ключ не будет
интерпретирован корректно.
Хотя JOSE ориентирован на JWK, библиотека поддерживает работу с PEM через промежуточные преобразования.
import { importSPKI, importPKCS8 } from 'jose';
const publicKey = await importSPKI(pemPublicKey, 'EdDSA');
const privateKey = await importPKCS8(pemPrivateKey, 'EdDSA');
Для Ed25519 и Ed448 PEM-форматы могут различаться в зависимости от генератора ключей, но JOSE абстрагирует криптографическую реализацию.
Внутри реализации используется детерминированная схема подписи:
В JOSE это полностью скрыто за API Web Crypto.
Ed25519
Ed448
Ключевой момент: в JOSE нет выбора алгоритма через строку
alg — всегда используется EdDSA, поэтому
безопасность определяется только кривой ключа.
Ed25519 демонстрирует высокую скорость подписи и проверки, что делает его предпочтительным для:
Ed448 применяется в сценариях:
В библиотеке jose обе реализации оптимизированы через
системные криптографические примитивы, поэтому разница в
производительности проявляется только на уровне кривой, а не
JS-кода.