ECDSA (Elliptic Curve Digital Signature Algorithm) основан на свойствах эллиптических кривых над конечными полями. В отличие от классических схем RSA, где безопасность опирается на факторизацию больших чисел, здесь используется сложность задачи дискретного логарифмирования на эллиптических кривых.
В контексте Web Crypto API ECDSA реализуется через интерфейс
SubtleCrypto, где работа с ключами и подписями полностью
асинхронна и выполняется в защищённом контексте браузера.
Ключевая идея схемы:
В Web Crypto API поддерживаются стандартизированные кривые семейства NIST:
Каждая кривая отличается уровнем криптографической стойкости и размером ключа.
Наиболее часто используемая кривая. Баланс между производительностью и безопасностью. Используется в TLS, JWT, мобильных приложениях и большинстве браузерных сценариев.
Более высокий уровень безопасности, применяемый в корпоративных и государственных системах.
Максимальный уровень безопасности среди поддерживаемых Web Crypto API кривых.
В Web Crypto API ключи создаются через
crypto.subtle.generateKey. Для ECDSA требуется указать
алгоритм, имя кривой и назначение ключей.
const keyPair = await crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-256"
},
true,
["sign", "verify"]
);
Параметры:
name: "ECDSA" — использование алгоритма цифровой
подписиnamedCurve — выбор кривой (P-256, P-384, P-521)extractable — возможность экспорта ключаkeyUsages — допустимые операции (подпись и
проверка)Результат содержит:
privateKeypublicKeyECDSA работает с бинарными данными. Перед подписью строковые данные
преобразуются в ArrayBuffer через
TextEncoder.
const encoder = new TextEncoder();
const data = encoder.encode("сообщение для подписи");
Подпись выполняется приватным ключом через
crypto.subtle.sign.
const signature = await crypto.subtle.sign(
{
name: "ECDSA",
hash: { name: "SHA-256" }
},
keyPair.privateKey,
data
);
Особенности:
ArrayBufferПубличный ключ используется для верификации через
crypto.subtle.verify.
const isValid = await crypto.subtle.verify(
{
name: "ECDSA",
hash: { name: "SHA-256" }
},
keyPair.publicKey,
signature,
data
);
Результат:
true — подпись корректнаfalse — данные изменены или подпись
недействительнаECDSA требует согласованности между размером кривой и хэш-функцией:
Несоответствие может привести к ошибке выполнения или снижению криптографической корректности.
Web Crypto API позволяет экспортировать ключи в стандартизированных форматах.
const exported = await crypto.subtle.exportKey(
"spki",
keyPair.publicKey
);
const exportedPrivate = await crypto.subtle.exportKey(
"pkcs8",
keyPair.privateKey
);
Форматы:
Оба формата представляют бинарные структуры ASN.1.
Импорт выполняется через crypto.subtle.importKey.
const publicKey = await crypto.subtle.importKey(
"spki",
exported,
{
name: "ECDSA",
namedCurve: "P-256"
},
true,
["verify"]
);
const privateKey = await crypto.subtle.importKey(
"pkcs8",
exportedPrivate,
{
name: "ECDSA",
namedCurve: "P-256"
},
true,
["sign"]
);
Подпись возвращается в формате ASN.1 DER, содержащем два числа:
Это стандартное представление ECDSA-подписи, отличающееся от “сырых” форматов, используемых в некоторых криптографических библиотеках.
ECDSA в Web Crypto API работает внутри изолированной криптографической подсистемы браузера:
extractable: falseСильные стороны модели:
Различия в вычислительной стоимости:
В браузерных приложениях P-256 остаётся стандартным выбором из-за оптимизации аппаратного ускорения в большинстве современных платформ.
ECDSA на базе Web Crypto API применяется в:
Каждый из этих сценариев опирается на одну и ту же модель: приватный ключ остаётся на стороне клиента или защищённого хранилища, публичный используется для проверки на стороне сервера.
P-256:
P-384:
P-521:
Процесс можно разложить на последовательность:
Проверка зеркально повторяет процесс с использованием публичного ключа.
Выбор P-256, P-384 или P-521 влияет не только на безопасность, но и на:
В браузерных приложениях баланс обычно смещён в сторону P-256 из-за аппаратной поддержки и предсказуемой производительности.
Все операции ECDSA выполняются асинхронно через Promise:
Это исключает блокировку основного потока браузера и обеспечивает стабильность интерфейса при криптографических вычислениях.