Библиотека Jsrsasign предоставляет полноценный набор
инструментов для работы с криптографией на стороне JavaScript, включая
создание и проверку цифровых подписей. Основная функция для проверки
подписи — verify, которая используется в различных
контекстах: RSA, ECDSA, HMAC, JWT и X.509 сертификаты.
Цифровая подпись в большинстве сценариев состоит из трёх компонентов:
Проверка заключается в том, чтобы убедиться, что подпись действительно была создана соответствующим приватным ключом и что данные не были изменены.
В Jsrsasign работа с RSA-подписями чаще всего осуществляется через
класс KJUR.crypto.Signature.
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withRSA" });
sig.init(publicKeyPem);
sig.updateString("Hello world");
const isValid = sig.verify(signatureHex);
Ключевые этапы:
init(publicKeyPem) — инициализация публичным ключом в
формате PEMupdateString() — загрузка данных, которые были
подписаныverify(signatureHex) — проверка подписи в
hex-форматеЕсли используется Base64 подпись, её необходимо предварительно декодировать или преобразовать.
Для алгоритмов на эллиптических кривых используется тот же интерфейс, но с другим алгоритмом:
const sig = new KJUR.crypto.Signature({ "alg": "SHA256withECDSA" });
sig.init(publicKeyPem);
sig.updateString("Important message");
const isValid = sig.verify(signatureHex);
ECDSA требует точного соответствия кривой, указанной в ключе, иначе проверка завершится ошибкой.
Jsrsasign предоставляет утилиту KEYUTIL, которая
позволяет преобразовывать ключи между форматами.
Загрузка публичного ключа:
const pubKey = KEYUTIL.getKey(publicKeyPem);
После этого ключ можно использовать в Signature:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(pubKey);
sig.updateString("Data");
const result = sig.verify(signatureHex);
Если данные представлены не строкой, а байтовым массивом:
sig.updateHex(binaryHexData);
const isValid = sig.verify(signatureHex);
Важно соблюдать единый формат входных данных: либо строковый, либо hex.
Jsrsasign умеет извлекать публичный ключ из сертификата:
const cert = new X509();
cert.readCertPEM(certPem);
const publicKey = cert.getPublicKey();
Далее проверка выполняется стандартным способом:
const sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("Message");
const isValid = sig.verify(signatureHex);
Одним из самых частых сценариев использования verify
является проверка JWT.
const isValid = KJUR.jws.JWS.verifyJWT(token, publicKey, {
alg: ["RS256"]
});
Расшифровка процесса:
Дополнительно можно получить payload:
const payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(payload));
Jsrsasign чувствителен к формату подписи:
Типичные ошибки:
SHA256withRSA vs
SHA1withRSA)Низкоуровневый вариант через KJUR.crypto.Signature
позволяет гибко управлять процессом:
const sig = new KJUR.crypto.Signature({
alg: "SHA256withRSA",
prov: "cryptojs/jsrsa"
});
sig.init(publicKey);
sig.updateString(data);
const verified = sig.verify(signatureHex);
Параметр prov указывает криптографический backend.
Иногда требуется динамическая проверка:
function verifySignature(alg, key, data, sigHex) {
const signature = new KJUR.crypto.Signature({ alg });
signature.init(key);
signature.updateString(data);
return signature.verify(sigHex);
}
Примеры алгоритмов:
SHA256withRSASHA384withRSASHA256withECDSASHA1withRSA (устаревший)Функция verify фактически отвечает за криптографическую
гарантию:
Любое изменение входных данных приводит к отрицательному результату проверки, даже если изменён один символ.
Процесс проверки включает:
При RSA используется модульная экспонентация, при ECDSA — проверка точек на кривой.
Jsrsasign одинаково работает в обеих средах, но:
cryptojs/jsrsaФункция всегда возвращает boolean:
true — подпись корректнаfalse — подпись недействительнаНикаких исключений при неправильной подписи обычно не выбрасывается, ошибка возникает только при неверных параметрах ключа или формата.