Алгоритмы семейства EdDSA (Edwards-curve Digital Signature
Algorithm), такие как Ed25519 и Ed448, представляют собой современные
криптографические схемы цифровой подписи, отличающиеся высокой
производительностью и устойчивостью к ряду атак, актуальных для ECDSA.
Они широко используются в протоколах нового поколения, включая TLS 1.3,
SSH и системы распределённых ключей.
Библиотека jsrsasign изначально разрабатывалась с акцентом на RSA и
классические варианты ECDSA, поэтому поддержка EdDSA в ней имеет ряд
особенностей и ограничений, которые необходимо учитывать при
разработке.
Архитектура реализации
В jsrsasign EdDSA реализуется не как полноценная часть основного
криптографического ядра, а как расширение поверх существующих механизмов
работы с ключами и подписями. Это накладывает следующие ограничения:
- Отсутствие полной интеграции с API класса
KJUR.crypto.Signature
- Ограниченная поддержка форматов ключей
- Частичная совместимость с ASN.1 структурами
Для работы с EdDSA используются специализированные классы и утилиты,
которые не всегда согласуются с общей архитектурой библиотеки.
Поддерживаемые алгоритмы
На практике в jsrsasign реализована поддержка:
- Ed25519 — основная и наиболее стабильная
реализация
- Ed448 — либо отсутствует, либо реализована частично
(в зависимости от версии)
При этом:
- Нет универсального интерфейса для выбора EdDSA через строковые
идентификаторы, как в случае
"SHA256withRSA"
- Используются отдельные методы и классы
Работа с ключами Ed25519
Генерация ключей
В jsrsasign отсутствует встроенный генератор Ed25519-ключей. Это
означает:
- Генерация должна происходить вне библиотеки
- Импорт ключей осуществляется в уже готовом виде
Типичные форматы:
- PEM (PKCS#8)
- Raw (массив байтов)
Импорт ключа
var key = KEYUTIL.getKey(pemString);
Ограничения:
- Не все PEM-заголовки корректно распознаются
- Возможны ошибки при работе с нестандартными ASN.1 структурами
Подписание данных
Для Ed25519 используется специализированный интерфейс, а не
стандартный Signature.
Пример:
var sig = new KJUR.crypto.EdDSA();
sig.init({ d: privateKeyHex });
sig.updateString("message");
var signature = sig.sign();
Особенности:
- Нет указания хеш-функции — она встроена в алгоритм
- Метод
updateHex предпочтительнее для бинарных
данных
- Подпись возвращается в hex-формате
Проверка подписи
var verifier = new KJUR.crypto.EdDSA();
verifier.init({ xy: publicKeyHex });
verifier.updateString("message");
var isValid = verifier.verify(signatureHex);
Ключевые моменты:
- Публичный ключ должен быть в формате
xy
- Ошибки формата не всегда явно сигнализируются
- Проверка чувствительна к точному соответствию входных данных
Ограничения API
Отсутствие унификации
В отличие от RSA/ECDSA:
- Нельзя использовать
KJUR.crypto.Signature с
"Ed25519"
- Нет поддержки через стандартный интерфейс
sign() /
verify() с алгоритмами в строковом виде
Ограниченная документация
- Официальная документация описывает EdDSA фрагментарно
- Некоторые методы доступны только через исходный код
Ограничения форматов
ASN.1 и DER
Поддержка ASN.1 структур для EdDSA ограничена:
- Не все OID корректно обрабатываются
- Возможны ошибки при парсинге сертификатов с Ed25519
JWK
Работа с JSON Web Key:
- Частично поддерживается
- Требуется ручное преобразование полей (
x,
d)
Пример JWK:
{
"kty": "OKP",
"crv": "Ed25519",
"x": "...",
"d": "..."
}
jsrsasign может не распознать такой ключ без дополнительной
обработки.
Ограничения безопасности
Отсутствие side-channel
защиты
Реализация EdDSA в jsrsasign:
- Не гарантирует защиту от атак по времени выполнения
- Не оптимизирована для защищённых сред
Использование JavaScript
- Выполнение в браузере или Node.js ограничивает контроль над
памятью
- Возможны утечки через GC и сторонние скрипты
Производительность
Хотя Ed25519 в теории быстрее ECDSA:
- Реализация на JavaScript нивелирует это преимущество
- Производительность уступает нативным библиотекам (например,
libsodium)
Факторы:
- Отсутствие WebAssembly-оптимизации
- Использование BigInteger вместо специализированных структур
Совместимость
С другими библиотеками
Проблемы совместимости возникают при:
- Использовании разных форматов ключей
- Различиях в кодировании подписи (raw vs DER)
Часто требуется:
- Конвертация ключей
- Нормализация подписи
С протоколами
- TLS и SSH не используют jsrsasign напрямую
- JWT с EdDSA поддерживается ограниченно
Поддержка JWT (EdDSA)
Алгоритм "EdDSA" используется в JWT:
var token = KJUR.jws.JWS.sign(
"EdDSA",
header,
payload,
privateKey
);
Ограничения:
- Требуется корректный формат ключа
- Не все версии jsrsasign поддерживают EdDSA в JWS
Типичные ошибки
Неверный формат ключа
- Hex вместо Base64
- Отсутствие правильной длины (32 байта для Ed25519)
Несоответствие данных
- Разные кодировки строки (
UTF-8 vs
ASCII)
- Использование
updateString вместо
updateHex
Ошибки при импорте
- PEM с нестандартными заголовками
- ASN.1 структуры, не поддерживаемые библиотекой
Обход ограничений
Использование внешних
библиотек
Для генерации ключей и базовых операций:
Затем:
- Импорт ключей в jsrsasign
- Использование только для интеграции с JWS/JWT
Конвертация форматов
Часто требуется ручная обработка:
var hex = b64tohex(base64Key);
Версионные особенности
Поддержка EdDSA зависит от версии jsrsasign:
- Старые версии — отсутствует полностью
- Средние версии — экспериментальная поддержка
- Новые версии — частично стабильная реализация Ed25519
Рекомендуется:
- Проверять changelog
- Тестировать конкретные сценарии
Практические ограничения
- Нельзя использовать EdDSA как drop-in замену ECDSA
- Требуется отдельная логика обработки ключей
- Ограничена интеграция с существующим API
Рекомендации по применению
Сравнение с ECDSA в
jsrsasign
| Характеристика |
ECDSA |
EdDSA (Ed25519) |
| Поддержка API |
Полная |
Частичная |
| Генерация ключей |
Есть |
Нет |
| ASN.1 |
Полная |
Ограниченная |
| Производительность |
Средняя |
Ниже ожидаемой |
| Безопасность |
Зависит от nonce |
Детерминированная |
Внутренние особенности
реализации
- Используются арифметические операции над кривыми Edwards
- Нет аппаратного ускорения
- Код ориентирован на читаемость, а не на производительность
Ограничения при
использовании в браузере
- Отсутствие доступа к WebCrypto API для EdDSA через jsrsasign
- Возможные конфликты с CSP
- Ограничения на размер данных
Перспективы развития
Поддержка EdDSA в jsrsasign развивается медленно:
- Основной фокус библиотеки остаётся на RSA и ECDSA
- Возможна интеграция с WebAssembly в будущем
- Улучшение совместимости с JWK и JWT ожидается, но не
гарантировано