Юридическая значимость электронной подписи определяется совокупностью правовых и технических условий, обеспечивающих идентификацию подписанта, целостность подписанного документа и невозможность его незаметного изменения после подписания. В цифровой среде ключевую роль играет криптография с открытым ключом, где подпись формируется закрытым ключом, а проверяется открытым.
Основой большинства юридически значимых электронных подписей выступают асимметричные алгоритмы: RSA, ECDSA, Ed25519 (в зависимости от правовой и технической среды). Принцип работы строится вокруг пары ключей:
= _{}(())
Хэш-функция выступает критическим элементом, обеспечивая фиксированную длину представления данных документа. На практике применяются SHA-256 и более устойчивые варианты семейства SHA-2 и SHA-3.
В большинстве юрисдикций юридическая сила электронной подписи связывается с выполнением следующих условий:
В рамках регулируемых систем дополнительно используются квалифицированные сертификаты, выдаваемые удостоверяющими центрами. Такие сертификаты связывают открытый ключ с конкретным субъектом права.
Инфраструктура открытых ключей (Public Key Infrastructure) включает:
Сертификат X.509 содержит:
Библиотека Jsrsasign предоставляет реализацию криптографических операций на JavaScript без необходимости обращения к нативным модулям. Поддерживаются RSA, ECDSA, X.509, PKCS#1, PKCS#7, CMS, а также операции с сертификатами.
Основные возможности:
В контексте RSA ключевая пара создается следующим образом:
const kp = KEYUTIL.generateKeypair("RSA", 2048);
const privateKey = kp.prvKeyObj;
const publicKey = kp.pubKeyObj;
Закрытый ключ хранится в защищенной среде, открытый ключ может быть включен в сертификат X.509.
Для формирования подписи используется объект
KJUR.crypto.Signature:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("Данные документа");
const signatureHex = sig.sign();
Подписывается не сам документ, а его криптографический хэш, что исключает влияние длины данных на алгоритм подписи.
Процесс верификации осуществляется с использованием открытого ключа:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("Данные документа");
const isValid = sig.verify(signatureHex);
Результат проверки определяется совпадением восстановленного и вычисленного хэша.
Сертификат в формате X.509 разбирается следующим образом:
const cert = new X509();
cert.readCertPEM(pemString);
const publicKey = cert.getPublicKey();
Из сертификата извлекается открытый ключ, используемый для проверки подписи, а также метаданные субъекта и издателя.
Юридическая значимость усиливается проверкой цепочки сертификатов:
Jsrsasign позволяет валидировать цепочку с использованием встроенных механизмов PKI-логики, включая проверку сроков действия и соответствия подписи центра сертификации.
Для комплексных подписанных сообщений используется PKCS#7:
const cms = new KJUR.asn1.cms.CMS();
cms.setContent("Hello");
cms.sign(privateKey, cert);
const pem = cms.getPEM();
Такие структуры позволяют включать подпись и сертификат в единый контейнер, что важно для юридически значимого документооборота.
Ключевым элементом остается хэш-функция:
H = (M)
где ( M ) — исходное сообщение.
Любое изменение входных данных приводит к изменению хэша, что делает подпись недействительной при модификации документа.
Jsrsasign поддерживает различные представления ключей:
Конвертация между форматами выполняется через
KEYUTIL:
const pem = KEYUTIL.getPEM(privateKey, "PKCS8PRV");
Полный цикл формирования подписи включает:
Криптографическая устойчивость обеспечивается:
Уязвимости чаще связаны не с алгоритмами, а с хранением ключей и ошибками реализации инфраструктуры доверия.
Библиотека используется в браузерных и серверных JavaScript-приложениях для:
Типовая архитектура включает выделенный модуль криптографии, изолированный от бизнес-логики, что снижает риск компрометации ключей и ошибок обработки данных.