Строковые идентификаторы алгоритмов

Строковые идентификаторы алгоритмов в Jsrsasign представляют собой центральный механизм, через который библиотека унифицирует работу с криптографическими функциями, цифровыми подписями и форматами стандартов PKI и JOSE. Внутри библиотеки один и тот же алгоритм может быть представлен сразу в нескольких формах — как имя в стиле OpenSSL, как JWS-идентификатор, как OID или как внутренний псевдоним.

Строковые идентификаторы используются для того, чтобы абстрагировать криптографические операции от конкретной реализации алгоритма. Вместо прямого вызова низкоуровневых функций разработчик передаёт строку, которая однозначно описывает алгоритм:

  • хеш-функцию
  • схему подписи
  • режим работы (например, HMAC или RSA-PSS)
  • совместимость с JWS/JWT

Библиотека Jsrsasign внутри выполняет сопоставление строки с конкретной реализацией.

Базовые формы записи алгоритмов

В Jsrsasign можно встретить несколько типов строковых идентификаторов:

  • криптографические имена OpenSSL-подобного формата SHA256withRSA, SHA1withECDSA
  • JWS-идентификаторы RS256, ES256, HS512
  • имена хеш-функций SHA-1, SHA-256, SHA-512
  • OID-строки 2.16.840.1.101.3.4.2.1 (SHA-256)
  • внутренние алиасы Jsrsasign SHA256, RSA-SHA256

Каждый тип может использоваться в зависимости от API: KJUR.crypto.Signature, KJUR.jws.JWS, KEYUTIL.

Алгоритмы хеширования

Хеш-функции задаются строками, которые часто совпадают с JCA/JCE именами.

Основные идентификаторы:

  • SHA1
  • SHA256
  • SHA384
  • SHA512
  • MD5

В некоторых контекстах допускаются расширенные формы:

  • SHA-1
  • SHA-256
  • SHA-512

Jsrsasign автоматически нормализует строки, сопоставляя их с внутренними реализациями.

Пример использования хеш-алгоритма в контексте подписи:

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

Здесь SHA256withRSA включает и хеш, и алгоритм подписи.

Алгоритмы цифровой подписи RSA

RSA-алгоритмы в Jsrsasign чаще всего представлены в формате:

  • SHA1withRSA
  • SHA256withRSA
  • SHA384withRSA
  • SHA512withRSA

Также встречаются JWS-эквиваленты:

  • RS256 → SHA-256 + RSA
  • RS384 → SHA-384 + RSA
  • RS512 → SHA-512 + RSA

Соответствие важно для JWT:

  • RS256 используется в JSON Web Signature
  • SHA256withRSA чаще применяется в PKCS#1 стиле API

Внутренне Jsrsasign преобразует RS256 в эквивалентную криптографическую цепочку.

HMAC-алгоритмы

HMAC идентификаторы используются для симметричной подписи:

  • HmacSHA1
  • HmacSHA256
  • HmacSHA384
  • HmacSHA512

JWS-эквиваленты:

  • HS256
  • HS384
  • HS512

Пример использования:

var sig = new KJUR.crypto.Signature({ "alg": "HmacSHA256" });
sig.init(secretKey);
sig.updateString("message");
var hmac = sig.sign();

В JWS-контексте:

  • HS256 автоматически мапится на HmacSHA256

ECDSA алгоритмы

ECDSA в Jsrsasign представляется через комбинации хешей и кривых.

Основные строки:

  • SHA1withECDSA
  • SHA256withECDSA
  • SHA384withECDSA
  • SHA512withECDSA

JWS-эквиваленты:

  • ES256 → P-256 + SHA-256
  • ES384 → P-384 + SHA-384
  • ES512 → P-521 + SHA-512

Внутреннее сопоставление учитывает не только хеш, но и кривую эллиптической криптографии:

  • P-256 (secp256r1)
  • P-384
  • P-521

Соответствие JWS алгоритмов

Jsrsasign активно используется в работе с JWT, поэтому поддерживает стандартизированные идентификаторы:

  • HS256, HS384, HS512
  • RS256, RS384, RS512
  • ES256, ES384, ES512
  • PS256, PS384, PS512

Алгоритмы PSS:

  • PS256 → RSASSA-PSS + SHA-256
  • PS512 → RSASSA-PSS + SHA-512

При использовании:

var sHeader = { alg: "RS256", typ: "JWT" };
var sPayload = { sub: "1234567890", name: "John Doe" };

var sJWT = KJUR.jws.JWS.sign(
  "RS256",
  sHeader,
  sPayload,
  privateKey
);

строка RS256 определяет полный криптографический стек.

Сопоставление OID и строковых идентификаторов

В PKI-системах алгоритмы часто определяются через OID (Object Identifier).

Примеры:

  • SHA-1 → 1.3.14.3.2.26
  • SHA-256 → 2.16.840.1.101.3.4.2.1
  • RSA → 1.2.840.113549.1.1.1

Jsrsasign поддерживает преобразование:

  • OID → строковое имя
  • строковое имя → OID

Это используется при парсинге сертификатов X.509:

var cert = new X509();
cert.readCertPEM(pemString);

var algName = cert.getSignatureAlgorithmName();

Результат может быть:

  • SHA256withRSA
  • или OID, преобразованный в читаемую форму

Внутренние алиасы и нормализация

Jsrsasign использует систему алиасов для унификации:

  • SHA-256SHA256
  • RSA-SHA256SHA256withRSA
  • ECDSA-SHA256SHA256withECDSA

Нормализация происходит на уровне:

  • KJUR.crypto.Util
  • KJUR.jws.JWS

Это позволяет принимать различные входные форматы без изменения логики приложения.

Использование в KJUR.crypto.Signature

Основной класс подписи принимает строковый идентификатор в параметре alg:

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

или

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

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

Расширенные режимы RSA-PSS

RSA-PSS использует более строгую схему подписи:

  • SHA256withRSAandMGF1
  • SHA512withRSAandMGF1

JWS обозначения:

  • PS256
  • PS512

Дополнительно может указываться параметр salt length, но в строковом идентификаторе это не отражается напрямую.

Роль строковых идентификаторов в архитектуре Jsrsasign

Строковые идентификаторы выполняют несколько функций одновременно:

  • унификация криптографического API
  • совместимость с JWS/JWT стандартами
  • поддержка PKI и X.509
  • абстракция над реализациями WebCrypto и Java-like криптографии
  • динамическое определение алгоритма без изменения кода

Именно за счёт этой системы Jsrsasign может поддерживать широкий спектр криптографических стандартов при минимальном API-интерфейсе.