Jsrsasign представляет собой чисто JavaScript-библиотеку для работы с криптографическими примитивами, X.509 сертификатами, JWT, JWS и JWE. Несмотря на широкий функционал, она не реализует все математические операции и алгоритмы «с нуля». Вместо этого она опирается на внешние зависимости, среди которых ключевыми являются jsbn и CryptoJS.
Такой подход позволяет разделить ответственность: низкоуровневая математика и базовые хеш-функции вынесены в отдельные библиотеки, а Jsrsasign сосредоточена на протоколах и форматах.
jsbn (JavaScript Big Number) — библиотека, реализующая арифметику больших целых чисел. Она является критически важной для криптографии, поскольку стандартные типы JavaScript (Number) не способны корректно работать с числами, используемыми в RSA, DSA и других алгоритмах.
RSA-алгоритм базируется на операции:
c = m^e mod n
m = c^d mod n
где:
Все эти операции требуют работы с числами, значительно превышающими 2^53 − 1, что делает jsbn обязательным компонентом.
Внутри Jsrsasign классы RSA используют объекты BigInteger из jsbn:
var rsa = new RSAKey();
rsa.setPublic(N, E);
var signature = rsa.signString("message", "sha256");
В этом процессе:
CryptoJS используется как поставщик криптографических хеш-функций и алгоритмов симметричного шифрования. Jsrsasign не реализует собственные версии SHA или HMAC полностью, а делегирует их CryptoJS.
Хеш-функции используются в нескольких ключевых местах:
Пример использования SHA-256 через Jsrsasign:
var hash = KJUR.crypto.Util.sha256("message");
Внутри этого вызова фактически используется CryptoJS:
CryptoJS.SHA256("message")
CryptoJS работает с собственной структурой WordArray, которая отличается от строк или Uint8Array:
Jsrsasign выполняет конвертацию между форматами:
Эти две зависимости выполняют разные роли и практически не пересекаются:
| Компонент | Назначение |
|---|---|
| jsbn | большие числа, RSA-математика |
| CryptoJS | хеширование, HMAC, симметричная криптография |
Jsrsasign объединяет их в единую криптографическую систему:
Процесс формирования подписи включает оба компонента:
Упрощённая схема:
header + "." + payload
↓
SHA-256 (CryptoJS)
↓
digest
↓
RSA sign (jsbn BigInteger)
↓
base64url signature
Архитектурное разделение связано с несколькими факторами:
Реализация криптографии требует значительных математических и алгоритмических ресурсов. Вынос позволяет избежать дублирования.
Jsrsasign может функционировать даже там, где отсутствует:
Каждая зависимость решает строго ограниченную задачу, что упрощает сопровождение.
Использование jsbn и CryptoJS накладывает ряд технических особенностей:
Одной из сложностей является работа с различными форматами данных:
KJUR.crypto.Util.str2hex("abc");
KJUR.crypto.Util.hex2b64("616263");
RSA ключи в Jsrsasign тесно связаны с jsbn:
var key = KEYUTIL.generateKeypair("RSA", 2048);
Внутри:
Jsrsasign можно представить как слой над криптографическим фундаментом:
Такая структура обеспечивает переносимость, предсказуемость и независимость от платформенных криптографических API.