ECDSA (Elliptic Curve Digital Signature Algorithm) используется в экосистеме JSON Web Tokens для создания компактных и криптографически стойких цифровых подписей. В библиотеке jose реализация семейства ECDSA представлена алгоритмами ES256, ES384, ES512, отличающимися уровнем криптографической стойкости и используемыми кривыми.
ECDSA основан на эллиптических кривых и обеспечивает тот же уровень безопасности, что и RSA при существенно меньшем размере ключей и подписей. Это критично для систем, где важны:
В JWT структура подписанного токена включает три части:
header.payload.signature
Для ECDSA алгоритмов signature формируется с использованием приватного ключа на основе эллиптической кривой.
Использует:
Особенности:
Применение:
Использует:
Особенности:
Применение:
Использует:
Особенности:
Применение:
Библиотека jose предоставляет низкоуровневый и высокоуровневый API для работы с JWT, JWS и JWK.
Основные возможности:
В jose ключи могут быть представлены в формате JWK.
Пример генерации ключевой пары ES256:
import { generateKeyPair } from 'jose'
const { publicKey, privateKey } = await generateKeyPair('ES256')
Аналогично для ES384 и ES512:
await generateKeyPair('ES384')
await generateKeyPair('ES512')
Результат:
privateKey используется для подписиpublicKey используется для проверки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' фиксирует алгоритм подписиimport { jwtVerify } from 'jose'
const { payload, protectedHeader } = await jwtVerify(token, publicKey, {
algorithms: ['ES256']
})
Особенности проверки:
ECDSA подпись состоит из двух чисел: r и s. В JWT они кодируются в формате:
(r || s)
В отличие от RSA, где подпись — это единый блок, ECDSA требует строгого соблюдения формата DER при обработке.
Библиотека jose автоматически:
Пример 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 | низкая | максимальный |
Практические наблюдения:
Если при верификации указан неверный алгоритм:
algorithms: ['ES384']
а токен подписан ES256, проверка завершится ошибкой.
ECDSA требует строго соответствующих пар ключей:
Некоторые старые системы:
ECDSA в jose часто применяется в:
Типовая схема:
Практика работы с ECDSA требует:
ECDSA является частью JWS (JSON Web Signature), который входит в стек JOSE:
Алгоритмы ES256/384/512 реализуют именно уровень JWS.