Что такое OID и как он устроен

OID (Object Identifier) — это уникальный числовой идентификатор, используемый для обозначения объектов в иерархических системах стандартизации. Он широко применяется в криптографии, X.509 сертификатах, ASN.1 структурах, протоколах безопасности и в библиотеке Jsrsasign для точного указания алгоритмов, атрибутов и типов данных.

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

1.2.840.113549.1.1.5

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


Иерархическая структура

OID устроен как дерево, где:

  • Каждый узел имеет числовое значение
  • Каждый дочерний узел наследует путь родителя
  • Полный путь определяет уникальность

Пример структуры:

1           (ISO)
 └── 2      (Member Body)
      └── 840  (USA)
           └── 113549  (RSA Data Security, Inc.)
                └── 1
                     └── 1
                          └── 5  (sha1WithRSAEncryption)

Таким образом, OID 1.2.840.113549.1.1.5 означает конкретный алгоритм подписи — SHA-1 с RSA.


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

OID начинается с одного из трёх корневых значений:

Значение Организация
0 ITU-T
1 ISO
2 Joint ISO/ITU-T

На практике чаще всего встречаются ветви:

  • 1.2 — ISO Member Bodies
  • 1.2.840 — США
  • 1.3.6.1 — Интернет (IANA, SNMP, LDAP и др.)

Формат представления

OID может быть представлен в двух формах:

1. Числовая (основная)

1.2.840.113549.1.1.1

2. Символьная (читаемая)

rsaEncryption

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


ASN.1 и кодирование OID

OID применяется в структурах ASN.1 и кодируется в бинарный формат DER/BER.

Пример ASN.1:

AlgorithmIdentifier ::= SEQUENCE {
  algorithm OBJECT IDENTIFIER,
  parameters ANY DEFINED BY algorithm OPTIONAL
}

DER-кодирование OID:

OID 1.2.840.113549.1.1.1 кодируется как:

06 09 2A 86 48 86 F7 0D 01 01 01

Где:

  • 06 — тег OBJECT IDENTIFIER
  • 09 — длина
  • Остальные байты — закодированные значения

Правила кодирования

  1. Первые два числа объединяются:

    (X * 40) + Y

    Например:

    1.2 → (1 * 40) + 2 = 42 → 0x2A
  2. Остальные числа кодируются в base-128:

    • Старший бит = признак продолжения
    • Значение разбивается на 7-битные группы

OID в криптографии

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

Алгоритмов подписи:

  • 1.2.840.113549.1.1.5 — SHA1withRSA
  • 1.2.840.113549.1.1.11 — SHA256withRSA

Хэш-функций:

  • 2.16.840.1.101.3.4.2.1 — SHA-256

Ключей:

  • 1.2.840.113549.1.1.1 — RSA

Полей сертификата:

  • 2.5.4.3 — Common Name (CN)
  • 2.5.4.6 — Country (C)

Использование OID в Jsrsasign

Библиотека Jsrsasign активно работает с OID при:

  • генерации сертификатов
  • проверке подписей
  • кодировании ASN.1
  • работе с PKCS# структуры

Пример: получение OID алгоритма

var oid = KJUR.crypto.OID.name2oid("SHA256withRSA");
console.log(oid);
// "1.2.840.113549.1.1.11"

Обратное преобразование:

var name = KJUR.crypto.OID.oid2name("1.2.840.113549.1.1.11");
console.log(name);
// "SHA256withRSA"

Таблица популярных OID в Jsrsasign

Название OID
rsaEncryption 1.2.840.113549.1.1.1
SHA1withRSA 1.2.840.113549.1.1.5
SHA256withRSA 1.2.840.113549.1.1.11
SHA512withRSA 1.2.840.113549.1.1.13
ECDSAwithSHA256 1.2.840.10045.4.3.2

Применение в X.509 сертификатах

OID определяет:

1. Алгоритм подписи сертификата

signatureAlgorithm

2. Поля субъекта и издателя

CN, O, C и др.

3. Расширения

basicConstraints → 2.5.29.19
keyUsage → 2.5.29.15

Пример в Jsrsasign:

var cert = new KJUR.asn1.x509.Certificate({
  sigalg: "SHA256withRSA",
  issuer: { str: "/C=US/O=Test CA/CN=Root" },
  subject: { str: "/C=US/O=Test/CN=User" }
});

Внутри библиотека автоматически преобразует SHA256withRSA в соответствующий OID.


Расширяемость OID

Каждая организация может регистрировать собственные ветви:

Пример:

1.3.6.1.4.1.<enterprise-number>

Где <enterprise-number> выдаётся IANA.

Это позволяет:

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

Ошибки и особенности

  • OID чувствителен к точности: ошибка в числе полностью меняет значение
  • Один и тот же алгоритм может иметь разные OID в разных стандартах (редко, но возможно)
  • Не все OID поддерживаются в библиотеке по имени — иногда требуется указывать вручную

Работа с кастомными OID в Jsrsasign

Добавление нового OID:

KJUR.crypto.OID.name2oidList["MyAlgorithm"] = "1.2.3.4.5";
KJUR.crypto.OID.oid2nameList["1.2.3.4.5"] = "MyAlgorithm";

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


Визуализация структуры OID

Пример:

1.3.6.1.4.1.311
│ │ │ │ │ │ └── Microsoft
│ │ │ │ │ └──── Private enterprises
│ │ │ │ └────── Internet
│ │ │ └──────── DoD
│ │ └────────── US
│ └──────────── ISO
└────────────── Root

Значение OID в безопасности

OID обеспечивает:

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

Без OID невозможна корректная работа PKI-инфраструктуры, сертификатов и цифровых подписей.


Связь с другими стандартами

OID используется в:

  • X.509
  • PKCS#1, PKCS#7
  • LDAP
  • SNMP
  • CMS (Cryptographic Message Syntax)

Jsrsasign реализует поддержку этих стандартов, опираясь на OID как ключевой механизм идентификации.


Итоговая структура понимания

  • OID — это путь в дереве
  • Каждое число — уровень иерархии
  • Полный путь уникален
  • Используется для идентификации алгоритмов и структур
  • В Jsrsasign связывает читаемые имена с криптографическими значениями