Семейство ECDSA: ES256, ES384, ES512

ECDSA (Elliptic Curve Digital Signature Algorithm) используется в экосистеме JSON Web Tokens для создания компактных и криптографически стойких цифровых подписей. В библиотеке jose реализация семейства ECDSA представлена алгоритмами ES256, ES384, ES512, отличающимися уровнем криптографической стойкости и используемыми кривыми.


Основы ECDSA в контексте JWT

ECDSA основан на эллиптических кривых и обеспечивает тот же уровень безопасности, что и RSA при существенно меньшем размере ключей и подписей. Это критично для систем, где важны:

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

В JWT структура подписанного токена включает три части:

header.payload.signature

Для ECDSA алгоритмов signature формируется с использованием приватного ключа на основе эллиптической кривой.


Семейство алгоритмов ES256, ES384, ES512

ES256

Использует:

  • Кривую: P-256 (secp256r1)
  • Хэш-функцию: SHA-256

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

  • Наиболее распространённый вариант
  • Баланс между скоростью и безопасностью
  • Поддерживается всеми современными платформами

Применение:

  • веб-приложения
  • мобильные API
  • микросервисная аутентификация

ES384

Использует:

  • Кривую: P-384
  • Хэш-функцию: SHA-384

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

  • Более высокий уровень криптографической стойкости
  • Медленнее ES256
  • Увеличенный размер подписи

Применение:

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

ES512

Использует:

  • Кривую: P-521
  • Хэш-функцию: SHA-512

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

  • Максимальный уровень стойкости в семействе ECDSA JWT
  • Самый медленный вариант
  • Наибольший размер подписи

Применение:

  • государственные системы
  • критически важные инфраструктуры
  • архивные или юридически значимые подписи

Библиотека jose и поддержка ECDSA

Библиотека jose предоставляет низкоуровневый и высокоуровневый API для работы с JWT, JWS и JWK.

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

  • генерация и импорт ключей
  • создание и проверка JWT
  • поддержка PEM и JWK форматов
  • строгая реализация спецификаций JOSE

Генерация ключей ECDSA

В jose ключи могут быть представлены в формате JWK.

Пример генерации ключевой пары ES256:

import { generateKeyPair } from 'jose'

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

Аналогично для ES384 и ES512:

await generateKeyPair('ES384')
await generateKeyPair('ES512')

Результат:

  • privateKey используется для подписи
  • publicKey используется для проверки

Подпись JWT с ES256

import { SignJWT } from 'jose'

const secretPayload = {
  sub: 'user_123',
  role: 'admin'
}

const token = await new SignJWT(secretPayload)
  .setProtectedHeader({ alg: 'ES256' })
  .setIssuedAt()
  .setExpirationTime('2h')
  .sign(privateKey)

Ключевые элементы:

  • alg: 'ES256' фиксирует алгоритм подписи
  • payload кодируется в base64url
  • подпись формируется с использованием ECDSA и SHA-256

Проверка JWT

import { jwtVerify } from 'jose'

const { payload, protectedHeader } = await jwtVerify(token, publicKey, {
  algorithms: ['ES256']
})

Особенности проверки:

  • строгое соответствие алгоритму
  • проверка подписи по публичному ключу
  • автоматическая декодировка payload

Различия формата подписи ECDSA

ECDSA подпись состоит из двух чисел: r и s. В JWT они кодируются в формате:

(r || s)

В отличие от RSA, где подпись — это единый блок, ECDSA требует строгого соблюдения формата DER при обработке.

Библиотека jose автоматически:

  • кодирует подпись в JWS-формат
  • декодирует при верификации
  • обеспечивает совместимость со спецификацией RFC 7518

Работа с JWK ключами

Пример JWK для ES256:

{
  "kty": "EC",
  "crv": "P-256",
  "x": "...",
  "y": "...",
  "d": "... (только приватный ключ)"
}

Импорт ключа:

import { importJWK } from 'jose'

const key = await importJWK(jwk, 'ES256')

Экспорт:

import { exportJWK } from 'jose'

const jwk = await exportJWK(publicKey)

Производительность и выбор алгоритма

Сравнение характеристик:

Алгоритм Кривая SHA Скорость Уровень безопасности
ES256 P-256 SHA-256 высокая базовый стандарт
ES384 P-384 SHA-384 средняя усиленный
ES512 P-521 SHA-512 низкая максимальный

Практические наблюдения:

  • ES256 оптимален для большинства API
  • ES384 используется при повышенных требованиях к стойкости
  • ES512 применяется редко из-за стоимости вычислений

Ошибки и особенности реализации

Несовпадение алгоритма

Если при верификации указан неверный алгоритм:

algorithms: ['ES384']

а токен подписан ES256, проверка завершится ошибкой.


Несоответствие ключей

ECDSA требует строго соответствующих пар ключей:

  • ES256 → только P-256
  • ES384 → только P-384
  • ES512 → только P-521

Проблемы совместимости

Некоторые старые системы:

  • неправильно обрабатывают DER-подписи
  • ожидают RSA вместо ECDSA
  • не поддерживают ES512

Использование в архитектуре сервисов

ECDSA в jose часто применяется в:

  • OAuth 2.0 / OpenID Connect
  • распределённых API-шлюзах
  • serverless архитектурах
  • подписании межсервисных сообщений

Типовая схема:

  1. сервис-аутентификатор подписывает JWT (ES256)
  2. микросервисы проверяют подпись по публичному ключу
  3. доступ к ресурсам определяется claims токена

Безопасное хранение ключей

Практика работы с ECDSA требует:

  • хранение приватного ключа вне репозитория
  • использование HSM или vault-систем
  • ротацию ключей
  • разделение публичных и приватных ключей

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

ECDSA является частью JWS (JSON Web Signature), который входит в стек JOSE:

  • JWS — подписи
  • JWE — шифрование
  • JWK — ключи
  • JWT — контейнер на основе JWS

Алгоритмы ES256/384/512 реализуют именно уровень JWS.