KJUR.crypto.Signature: методы и параметры

KJUR.crypto.Signature — основной класс библиотеки Jsrsasign, предназначенный для формирования и проверки цифровых подписей на основе криптографических алгоритмов RSA, ECDSA и других. Реализация опирается на стандартные схемы подписи вида “хэш + асимметричное шифрование”, где входные данные сначала хэшируются, а затем результат подписывается приватным ключом.


Класс работает по универсальной схеме:

  1. Инициализация объекта с указанием алгоритма подписи
  2. Передача ключа (приватного для подписи или публичного для проверки)
  3. Постепенная или однократная подача данных
  4. Генерация подписи или её проверка

Основной формат алгоритмов:

  • SHA1withRSA
  • SHA256withRSA
  • SHA384withRSA
  • SHA512withRSA
  • SHA256withECDSA
  • SHA1withDSA

Создание объекта Signature

Инициализация выполняется через конструктор с параметрами конфигурации.

Синтаксис

var sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });

Основные параметры конструктора

  • alg — строка, определяющая алгоритм подписи
  • prov — криптографический провайдер (редко используется, по умолчанию встроенный)

Пример:

var sig = new KJUR.crypto.Signature({
    alg: "SHA512withRSA"
});

Метод init()

Метод init() задаёт ключ для операции подписи или проверки.

Синтаксис

sig.init(key);

Параметры

  • key — объект ключа:

    • для подписи: приватный ключ (RSAKey, KJUR.crypto.ECDSA)
    • для проверки: публичный ключ

Особенности поведения

  • При использовании приватного ключа объект готовится к созданию подписи
  • При использовании публичного ключа — к верификации подписи

Метод updateString()

Добавляет строковые данные в поток подписи.

Синтаксис

sig.updateString(data);

Параметры

  • data — строка, которая будет включена в хэш

Особенности

  • Можно вызывать несколько раз
  • Данные накапливаются в буфере перед вычислением хэша
  • Используется для потоковой обработки данных

Метод updateHex()

Аналог updateString(), но работает с hex-строками.

Синтаксис

sig.updateHex(hexData);

Параметры

  • hexData — данные в шестнадцатеричном формате

Метод sign()

Генерирует цифровую подпись для ранее переданных данных.

Синтаксис

var signature = sig.sign();

Возвращаемое значение

  • строка в hex-формате, представляющая подпись

Поведение

  • сначала вычисляется хэш от накопленных данных
  • затем хэш шифруется приватным ключом согласно алгоритму

Важные особенности

  • работает только после init() с приватным ключом
  • после вызова состояние объекта обычно требует повторной инициализации для новой подписи

Метод verify()

Проверяет корректность подписи.

Синтаксис

var result = sig.verify(signature);

Параметры

  • signature — строка подписи в hex-формате

Возвращаемое значение

  • true — подпись корректна
  • false — подпись недействительна

Механизм работы

  1. Вычисляется хэш от входных данных
  2. Подпись расшифровывается публичным ключом
  3. Сравниваются значения хэша

Пример полного цикла подписи

Создание подписи

var sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(privateKey);
sig.updateString("data to sign");
var signature = sig.sign();

Проверка подписи

var sig = new KJUR.crypto.Signature({ alg: "SHA256withRSA" });
sig.init(publicKey);
sig.updateString("data to sign");
var isValid = sig.verify(signature);

Работа с разными типами ключей

RSA

Используется наиболее часто. Поддерживает все SHA-* алгоритмы.

  • SHA256withRSA
  • SHA512withRSA

Ключи обычно создаются через:

var rsa = new RSAKey();
rsa.generate(2048, "10001");

ECDSA

Использует эллиптические кривые.

var sig = new KJUR.crypto.Signature({ alg: "SHA256withECDSA" });

Особенности:

  • меньший размер подписи
  • высокая криптостойкость при меньшей длине ключа

DSA

Используется реже, считается устаревающим.

var sig = new KJUR.crypto.Signature({ alg: "SHA1withDSA" });

Внутренний процесс формирования подписи

  1. Сбор данных через updateString / updateHex

  2. Построение хэш-значения согласно алгоритму (SHA-256, SHA-512 и др.)

  3. Кодирование хэша в ASN.1 структуру

  4. Криптографическая операция:

    • RSA: шифрование приватным ключом
    • ECDSA: вычисление пары (r, s)
  5. Возврат результата в hex-формате


Внутренний процесс проверки подписи

  1. Повторное вычисление хэша от данных
  2. Декодирование подписи
  3. Криптографическая проверка через публичный ключ
  4. Сравнение результатов

Ошибки и типичные проблемы

Несовпадение алгоритма

Подпись, созданная с SHA256withRSA, не проверяется через SHA1withRSA.


Неправильный ключ

  • приватный ключ используется только для sign
  • публичный ключ только для verify

Разные входные данные

Даже минимальное отличие строки приводит к полной невалидности подписи.


Повторное использование объекта

После sign() или verify() рекомендуется создавать новый объект, чтобы избежать накопления данных в буфере.


Формат результата подписи

  • hex-строка
  • без префиксов
  • фиксированной длины в зависимости от алгоритма и ключа

Пример:

8f3a91c2d4b5...

Практика потоковой подписи

Для больших данных используется поэтапная передача:

sig.init(privateKey);
sig.updateString(part1);
sig.updateString(part2);
sig.updateString(part3);
var signature = sig.sign();

Это позволяет обрабатывать данные без загрузки всей строки в память.


Совместимость и окружения

KJUR.crypto.Signature работает в:

  • браузерах
  • Node.js (через jsrsasign)
  • гибридных средах

Не требует нативных криптографических API, так как реализует алгоритмы на JavaScript.