Класс KJUR.crypto.Signature из библиотеки Jsrsasign
предназначен для формирования и проверки цифровых подписей на основе
различных криптографических алгоритмов. Он реализует высокоуровневый
интерфейс поверх механизмов хеширования и асимметричного шифрования,
позволяя работать с RSA, ECDSA и другими схемами подписи без
необходимости ручного управления низкоуровневыми криптопримитивами.
Основная особенность класса заключается в поддержке потокового режима обработки данных, при котором подпись формируется не из готового блока, а из последовательности поступающих фрагментов.
KJUR.crypto.Signature построен вокруг классической схемы
цифровой подписи:
SHA256withRSA)Внутренне класс объединяет:
Наиболее часто используемые строки алгоритмов:
SHA1withRSASHA256withRSASHA384withRSASHA512withRSASHA256withECDSASHA1withECDSAСтруктура строки всегда соответствует формату:
<HASH>with<ALGORITHM>
где:
Создание экземпляра Signature осуществляется через указание алгоритма:
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
Возможные параметры конфигурации:
alg — алгоритм подписиprov — криптопровайдер (например,
cryptojs/jsrsa)prvkeypem — приватный ключ в PEM-формате
(опционально)pubkeypem — публичный ключ в PEM-формате
(опционально)sig.init(privateKeyPEM);
Приватный ключ может быть представлен в формате:
sig.init(publicKeyPEM);
или явное указание режима:
sig.init({ "pubkey": publicKeyPEM });
При создании цифровой подписи используется последовательность:
sig.init(privateKeyPEM);
sig.updateString("данные");
var signature = sig.sign();
Добавление строки:
sig.updateString("Hello world");
Добавление данных в hex-формате:
sig.updateHex("4a6f686e");
Работа с массивами байт:
sig.updateByteArray([0x4a, 0x6f, 0x68, 0x6e]);
После завершения подачи данных вызывается:
var sigValue = sig.sign();
Результат обычно возвращается в формате HEX или Base64 (в зависимости от конфигурации провайдера).
Проверка цифровой подписи выполняется аналогично, но с публичным ключом:
sig.init(publicKeyPEM);
sig.updateString("данные");
var result = sig.verify(signatureHex);
true — подпись корректнаfalse — подпись не совпадаетКласс поддерживает инкрементальное добавление данных:
sig.init(privateKeyPEM);
sig.updateString("часть 1 ");
sig.updateString("часть 2");
sig.updateString("часть 3");
var signature = sig.sign();
Это позволяет обрабатывать большие данные без необходимости их предварительной конкатенации.
Алгоритм подписи включает два этапа:
Пример для SHA256withRSA:
data → SHA-256 → digest → RSA encrypt (private key) → signature
При проверке выполняется обратная операция с использованием публичного ключа.
Поддерживаются:
Пример:
-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
Используются кривые:
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(privateKeyPEM);
sig.updateString("message");
var signature = sig.sign();
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(publicKeyPEM);
sig.updateString("message");
var isValid = sig.verify(signature);
var sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(privateKeyPEM);
sig.updateString("message");
var signature = sig.sign();
ECDSA требует точного совпадения:
Подпись обычно возвращается в ASN.1 DER формате, закодированном в HEX или Base64.
В зависимости от провайдера и конфигурации:
Преобразование часто выполняется через вспомогательные утилиты Jsrsasign.
Типичные причины ошибок:
init → update → sign/verify)В зависимости от конфигурации могут использоваться:
Выбор влияет на совместимость с внешними системами и уровень криптостойкости.
initKJUR.crypto.Signature часто применяется в:
Класс тесно связан с:
KJUR.crypto.MessageDigest — вычисление хешаKEYUTIL — загрузка ключейKJUR.asn1 — работа с DER структурамиKJUR.crypto.Cipher — вспомогательное шифрованиеПри работе с KJUR.crypto.Signature ключевым аспектом
является согласованность всех компонентов криптосхемы:
Любое расхождение в этих параметрах приводит к невозможности верификации подписи даже при корректных ключах.