Конвертация OID ↔ строка

OID (Object Identifier) представляет собой иерархическую систему числовых идентификаторов, используемых в криптографии и ASN.1 для однозначного обозначения алгоритмов, атрибутов, расширений сертификатов и структурных элементов. В виде строки OID записывается как последовательность чисел, разделённых точками, например 1.2.840.113549.1.1.5. В прикладных библиотеках, включая Jsrsasign, поверх этого формата часто накладывается слой человекочитаемых имен, таких как sha1WithRSAEncryption или rsaEncryption.

В Jsrsasign работа с OID сосредоточена в таблицах соответствий и утилитах, позволяющих выполнять двустороннюю конвертацию: строковое имя ↔︎ числовой OID. Это необходимо при разборе сертификатов X.509, генерации подписей, формировании ASN.1 структур и интерпретации криптографических параметров.

Внутри библиотеки OID используется в двух основных формах:

  • числовая строка (dotted decimal notation)
  • символьное имя (friendly name)

Пример соответствия:

  • "rsaEncryption" ↔︎ "1.2.840.113549.1.1.1"
  • "sha256WithRSAEncryption" ↔︎ "1.2.840.113549.1.1.11"

Такая модель позволяет работать на уровне абстракции алгоритмов, не оперируя «сырыми» идентификаторами, но при необходимости переходить к ASN.1 представлению.

Таблицы соответствий OID

В Jsrsasign используется внутренний словарь, содержащий отображения между именами и OID. Он включает:

  • алгоритмы подписи
  • криптографические хеш-функции
  • атрибуты X.500
  • расширения сертификатов
  • ключевые назначения (key usage, extended key usage)

Структурно это выглядит как две взаимосвязанные таблицы:

  • name → oid
  • oid → name

Подобная организация позволяет выполнять обратимые преобразования без потери информации.

Конвертация имени OID в числовую строку

Для преобразования символьного имени в OID используется утилитарный слой Jsrsasign, связанный с ASN.1 и криптографическими объектами.

Типичный сценарий — получение OID алгоритма подписи:

var oid = KJUR.asn1.x509.OID.name2oid("sha256WithRSAEncryption");

Результат:

1.2.840.113549.1.1.11

Механизм работает через внутреннюю таблицу соответствий, где ключом выступает строковое имя, а значением — ASN.1 идентификатор.

В случае отсутствия имени в таблице возвращается неопределённое значение или исходная строка без преобразования, в зависимости от контекста использования.

Конвертация числового OID в символьное имя

Обратное преобразование применяется при анализе сертификатов X.509, когда ASN.1 структура содержит только числовой идентификатор.

Пример:

var name = KJUR.asn1.x509.OID.oid2name("1.2.840.113549.1.1.11");

Результат:

sha256WithRSAEncryption

Такое преобразование критично при интерпретации подписей, так как ASN.1 сертификаты всегда хранят алгоритмы в виде OID, а не строковых описаний.

Использование OID при разборе сертификатов

При декодировании X.509 структуры OID встречается в нескольких ключевых местах:

  • signatureAlgorithm
  • signatureAlgorithm parameters
  • subjectPublicKeyInfo.algorithm
  • extensions

Jsrsasign при парсинге сертификата автоматически применяет таблицы OID для упрощения вывода:

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

var sigAlgOid = cert.getSignatureAlgorithmField();
var sigAlgName = KJUR.asn1.x509.OID.oid2name(sigAlgOid);

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

Поддержка расширений X.509 через OID

Расширения сертификатов также идентифицируются через OID. Например:

  • basicConstraints2.5.29.19
  • keyUsage2.5.29.15
  • subjectAltName2.5.29.17

Jsrsasign использует OID для определения типа расширения при парсинге:

var extName = KJUR.asn1.x509.OID.oid2name("2.5.29.15");

Результат:

keyUsage

Если расширение не входит в стандартный набор, оно остаётся в виде числового OID без преобразования.

Добавление пользовательских OID

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

Пример расширения таблицы:

KJUR.asn1.x509.OID.name2oidList["customAlgorithm"] = "1.2.3.4.5.6.7.8.9";
KJUR.asn1.x509.OID.oid2nameList["1.2.3.4.5.6.7.8.9"] = "customAlgorithm";

После этого преобразования становятся двусторонними:

KJUR.asn1.x509.OID.name2oid("customAlgorithm");
// 1.2.3.4.5.6.7.8.9

KJUR.asn1.x509.OID.oid2name("1.2.3.4.5.6.7.8.9");
// customAlgorithm

OID в криптографических алгоритмах

OID тесно связан с определением алгоритмов в криптографических структурах. В Jsrsasign он используется для:

  • RSA / ECDSA идентификации
  • SHA-хеширования
  • PBE и PBKDF алгоритмов
  • HMAC конструкций

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

var algOid = KJUR.asn1.x509.OID.name2oid("sha1WithRSAEncryption");

Далее этот OID включается в ASN.1 структуру AlgorithmIdentifier.

Внутренняя логика преобразования

Механизм конвертации в Jsrsasign не использует внешние сервисы или динамическое разрешение. Он основан на статических JSON-подобных структурах.

Алгоритм работы:

  1. Проверка наличия имени в name2oidList
  2. Возврат OID при совпадении
  3. При обратном преобразовании поиск в oid2nameList
  4. Возврат fallback-значения при отсутствии совпадения

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

Особенности обработки неизвестных OID

При встрече неизвестного идентификатора библиотека сохраняет его в исходном виде:

  • строка "1.2.999.1" остаётся без изменений
  • имя не генерируется автоматически
  • структура сертификата сохраняет полную целостность

Это важно при работе с нестандартными криптографическими расширениями.

Использование OID в ASN.1 генерации

При создании ASN.1 структур OID кодируется как OBJECT IDENTIFIER тип:

var alg = {
  name: "sha256WithRSAEncryption",
  oid: KJUR.asn1.x509.OID.name2oid("sha256WithRSAEncryption")
};

В ASN.1 сериализации используется именно числовая форма, поскольку она является обязательной в стандарте X.509.

Практическое значение двусторонней конвертации

Система преобразования OID ↔︎ имя решает ключевую задачу интерпретации криптографических данных:

  • ASN.1 слой оперирует числами
  • прикладной слой оперирует именами

Jsrsasign выполняет роль связующего уровня, обеспечивая согласованность между ними без необходимости ручного сопоставления идентификаторов.