В Web Crypto API эллиптические кривые семейства NIST P-256, P-384 и
P-521 используются в алгоритмах ECDH и ECDSA. Эти кривые определяют
математическую основу для асимметричной криптографии на эллиптических
кривых и задают уровень криптографической стойкости, размер ключей и
производительность операций.
Поддержка в Web Crypto API выражается через именованные параметры при
генерации ключей:
P-256 → namedCurve: "P-256"
P-384 → namedCurve: "P-384"
P-521 → namedCurve: "P-521"
Использование происходит через SubtleCrypto.generateKey,
sign, verify, deriveKey,
deriveBits.
Математическая
основа и особенности семейств кривых
Эллиптические кривые NIST определяются над конечными полями простого
порядка. Каждая кривая задаётся уравнением вида:
y² = x³ + ax + b (mod p)
где параметры различаются для каждой кривой.
P-256 (secp256r1)
Наиболее широко используемая кривая в прикладной криптографии.
- Размер ключа: 256 бит
- Уровень безопасности: ~128 бит
- Оптимизирована для большинства аппаратных платформ
- Используется по умолчанию во многих TLS-конфигурациях
Характерные свойства:
- Хороший баланс между скоростью и стойкостью
- Широкая аппаратная поддержка (CPU инструкции, HSM)
- Минимальная задержка операций подписи и проверки
P-384 (secp384r1)
Кривая с увеличенной длиной ключа и более высоким уровнем
стойкости.
- Размер ключа: 384 бит
- Уровень безопасности: ~192 бит
- Более медленная, чем P-256
- Используется в высокозащищённых системах
Особенности:
- Устойчивость к атакам с более высоким вычислительным ресурсом
- Часто применяется в государственных и финансовых системах
- Более высокая стоимость операций ECDSA и ECDH
P-521 (secp521r1)
Кривая с максимальным уровнем безопасности среди стандартных
NIST-кривых.
- Размер ключа: 521 бит
- Уровень безопасности: ~256 бит
- Наиболее затратная по вычислениям
- Использует нестандартную длину поля (не кратную байтам)
Особенности:
- Максимальная криптографическая стойкость в WebCrypto из стандартных
вариантов
- Существенно более медленная генерация и операции подписи
- Используется редко, в системах с долгим горизонтом безопасности
Поддержка в Web Crypto API
Генерация ключей для ECDSA:
const keyPair = await crypto.subtle.generateKey(
{
name: "ECDSA",
namedCurve: "P-256"
},
true,
["sign", "verify"]
);
Аналогично для других кривых:
namedCurve: "P-384"
namedCurve: "P-521"
ECDH:
const keyPair = await crypto.subtle.generateKey(
{
name: "ECDH",
namedCurve: "P-256"
},
true,
["deriveKey", "deriveBits"]
);
Сравнение характеристик
| Кривая |
Длина ключа |
Уровень безопасности |
Производительность |
Область применения |
| P-256 |
256 бит |
~128 бит |
высокая |
Web, TLS, мобильные приложения |
| P-384 |
384 бит |
~192 бит |
средняя |
финансы, государственные системы |
| P-521 |
521 бит |
~256 бит |
низкая |
долгосрочная защита, специализированные системы |
Производительность и
практические различия
Разница между кривыми становится критичной при массовых
криптографических операциях:
Операции подписи (ECDSA)
- P-256 выполняет подпись значительно быстрее благодаря оптимизациям
процессоров
- P-384 требует примерно на 40–70% больше времени
- P-521 может быть в 2–4 раза медленнее P-256
Обмен ключами (ECDH)
ECDH чувствителен к размеру скаляра:
- P-256 обеспечивает минимальную задержку при установлении сессий
- P-384 используется при необходимости усиленной защиты канала
- P-521 увеличивает время рукопожатия и генерации общего секрета
Криптографическая стойкость
Уровни безопасности соответствуют приблизительной стойкости к атаке
перебором:
- P-256 → ~2^128 операций
- P-384 → ~2^192 операций
- P-521 → ~2^256 операций
Важно учитывать, что эти значения отражают теоретическую стойкость и
не учитывают квантовые модели атак, где ECC потенциально уязвима к
алгоритму Шора.
Совместимость и экосистема
P-256
- Поддерживается всеми современными браузерами
- Широко используется в TLS 1.2 и 1.3
- Поддержка в аппаратных криптомодулях
P-384
- Поддерживается во всех современных браузерах
- Используется в TLS-шифрах с повышенной стойкостью
- Часто применяется в цифровых сертификатах высокого уровня
доверия
P-521
- Поддержка есть, но реже используется в реальных веб-сценариях
- Может отсутствовать в некоторых аппаратных ускорителях
- Часто заменяется P-384 как компромисс
Практическое применение в
WebCrypto
Подпись данных (ECDSA)
const signature = await crypto.subtle.sign(
{
name: "ECDSA",
hash: "SHA-256"
},
privateKey,
data
);
Выбор хэша часто зависит от кривой:
- P-256 → SHA-256
- P-384 → SHA-384
- P-521 → SHA-512
Проверка подписи
const valid = await crypto.subtle.verify(
{
name: "ECDSA",
hash: "SHA-256"
},
publicKey,
signature,
data
);
ECDH и вывод общего секрета
const secret = await crypto.subtle.deriveBits(
{
name: "ECDH",
public: otherPublicKey
},
privateKey,
256
);
Размер выходных данных обычно сопоставляется с уровнем выбранной
кривой.
Выбор кривой в реальных
системах
P-256 используется, когда:
- важна скорость
- высокая нагрузка на сервер
- стандартные веб-приложения
- мобильные клиенты
P-384 используется, когда:
- требуется повышенная криптостойкость
- финансовые транзакции
- корпоративные PKI
P-521 используется, когда:
- требуется максимальный запас безопасности
- длительное хранение секретов
- специализированные криптографические системы
Ограничения и нюансы
WebCrypto
- Нет возможности задавать произвольные кривые — только фиксированный
набор NIST
- Поведение зависит от реализации браузера и ОС
- Производительность может меняться при аппаратном ускорении
- Некоторые устройства не ускоряют P-384 и P-521
Безопасные практики выбора
- Использование P-256 остаётся стандартом де-факто для веба
- P-384 — компромисс между безопасностью и производительностью
- P-521 оправдан только при чётко определённых требованиях к
долгосрочной стойкости
- Совмещение кривых в одной системе усложняет управление ключами и
увеличивает поверхность ошибок