Поиск OID по имени и наоборот

Объектный идентификатор (Object Identifier, OID) представляет собой иерархическую последовательность чисел, разделённых точками, например:

1.2.840.113549.1.1.11

Такие идентификаторы используются в криптографии и X.509 для описания алгоритмов, расширений сертификатов, атрибутов субъектов и множества других структурных элементов. В практике работы с PKI они выступают универсальным способом кодирования именованных сущностей в машинно-независимом формате.

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


Модель сопоставления OID в Jsrsasign

В основе лежит словарь соответствий:

  • имя алгоритма или атрибута → OID
  • OID → имя

Эти отображения используются при:

  • разборе сертификатов X.509
  • формировании подписей
  • кодировании ASN.1 структур
  • интерпретации расширений сертификата

Основной объект, отвечающий за работу с идентификаторами:

KJUR.asn1.x509.OID

Он содержит предопределённые таблицы и методы для поиска.


Преобразование имени в OID

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

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

const oid = KJUR.asn1.x509.OID.name2oid("sha256WithRSAEncryption");
console.log(oid);
// 1.2.840.113549.1.1.11

Внутренняя логика:

  • имя нормализуется
  • выполняется поиск в словаре OID
  • возвращается строковое представление числового пути

Типичные категории имен

Алгоритмы подписи

  • sha1WithRSAEncryption
  • sha256WithRSAEncryption
  • ecdsaWithSHA256

Хеш-функции

  • sha1
  • sha256
  • sha512

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

  • rsaEncryption
  • id-ecPublicKey

Расширения X.509

  • basicConstraints
  • keyUsage
  • subjectAltName

Преобразование OID в имя

Обратная операция используется при разборе сертификатов и ASN.1 структур.

const name = KJUR.asn1.x509.OID.oid2name("1.2.840.113549.1.1.11");
console.log(name);
// sha256WithRSAEncryption

Если OID отсутствует в таблице, возвращается:

  • исходная строка OID без изменений
  • либо неопределённое значение в зависимости от версии библиотеки

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

При декодировании сертификата часто встречается структура:

AlgorithmIdentifier
  algorithm: OID
  parameters: ANY

Jsrsasign при парсинге выполняет обратное отображение:

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

const algOid = cert.getSignatureAlgorithmOID();
const algName = KJUR.asn1.x509.OID.oid2name(algOid);

Результат позволяет перейти от низкоуровневого ASN.1 представления к логическому имени алгоритма.


Таблица соответствий и её структура

Внутренний словарь OID организован как объект:

KJUR.asn1.x509.OID.name2oidList = {
  "rsaEncryption": "1.2.840.113549.1.1.1",
  "sha256WithRSAEncryption": "1.2.840.113549.1.1.11"
}

И обратная структура:

KJUR.asn1.x509.OID.oid2nameList = {
  "1.2.840.113549.1.1.1": "rsaEncryption",
  "1.2.840.113549.1.1.11": "sha256WithRSAEncryption"
}

Алгоритм поиска:

  • прямое обращение к объекту по ключу
  • отсутствие приводит к возврату null/undefined
  • отсутствие значения не вызывает исключений

Нормализация идентификаторов

При работе с OID важна строгая нормализация входных данных:

  • строки не должны содержать пробелов
  • регистр имен имеет значение
  • допустимы только стандартные ASCII-строки для имен

Пример:

KJUR.asn1.x509.OID.name2oid("SHA256WITHRSAENCRYPTION"); // может не сработать
KJUR.asn1.x509.OID.name2oid("sha256WithRSAEncryption"); // корректно

Расширение таблицы OID

Jsrsasign позволяет добавлять собственные идентификаторы:

KJUR.asn1.x509.OID.name2oidList["myCustomAlg"] = "1.2.3.4.5.6.7";
KJUR.asn1.x509.OID.oid2nameList["1.2.3.4.5.6.7"] = "myCustomAlg";

Это используется при:

  • работе с корпоративными PKI
  • нестандартными криптографическими расширениями
  • экспериментальными алгоритмами

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

KJUR.asn1.x509.OID.name2oid("myCustomAlg");
KJUR.asn1.x509.OID.oid2name("1.2.3.4.5.6.7");

OID в структуре SubjectPublicKeyInfo

В публичных ключах X.509 OID определяет тип ключа:

const spki = KJUR.asn1.x509.X509.getPublicKeyFromCertPEM(pem);

Тип ключа извлекается через OID:

  • rsaEncryption → RSA ключ
  • id-ecPublicKey → ECC ключ

Пример интерпретации:

const oid = spki.algOid;
const keyType = KJUR.asn1.x509.OID.oid2name(oid);

Работа с расширениями сертификатов

Расширения X.509 также идентифицируются через OID:

  • 2.5.29.15 — keyUsage
  • 2.5.29.19 — basicConstraints
  • 2.5.29.17 — subjectAltName

Разбор:

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

Использование имени упрощает обработку логики:

if (extName === "keyUsage") {
  // обработка ограничений ключа
}

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

При обработке OID важно учитывать различие:

Числовая форма

1.2.840.113549.1.1.11

Символическая форма

sha256WithRSAEncryption

Преобразование в Jsrsasign служит мостом между:

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

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

Встречаются случаи, когда OID отсутствует в стандартной таблице.

Поведение:

const name = KJUR.asn1.x509.OID.oid2name("1.2.999.999.1");

Результат:

  • возвращается исходный OID
  • либо undefined (в зависимости от версии)

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


Производительность поиска OID

Поиск реализован через прямой доступ к объекту Jav * aScript:

  • O(1) сложность
  • отсутствие перебора массивов
  • минимальная накладная стоимость

Это критично при массовом разборе сертификатов, где операции выполняются тысячами раз.


Типовые сценарии применения

Разбор сертификата

  • извлечение алгоритма подписи
  • определение расширений

Формирование CSR

  • указание алгоритмов через имена

Проверка политики сертификата

  • анализ OID расширений

Интеграция с внешними системами

  • преобразование OID для API, требующих строковые идентификаторы

Особенности совместимости

Jsrsasign поддерживает стандартные OID из:

  • PKCS #1
  • PKCS #7
  • X.509 v3
  • ECC (SEC / NIST кривые)

При обновлении криптографических стандартов таблица OID расширяется без изменения базового API преобразования.