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

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

Структура OID задаётся в виде строкового представления:

2.16.840.1.101.3.4.2.1

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

Основные OID алгоритмов хеширования

Алгоритмы хеширования, применяемые в криптографических протоколах, стандартизированы и имеют закреплённые идентификаторы:

SHA-1 и его идентификатор

SHA-1 исторически использовался в цифровых подписях и сертификатах:

1.3.14.3.2.26

Несмотря на широкое распространение в прошлом, алгоритм считается криптографически небезопасным.

Семейство SHA-2

SHA-2 включает несколько вариантов с различной длиной выхода:

SHA-256

2.16.840.1.101.3.4.2.1

Наиболее часто используемый алгоритм в современных TLS-сертификатах.

SHA-384

2.16.840.1.101.3.4.2.2

Применяется в высокозащищённых системах и криптографических протоколах.

SHA-512

2.16.840.1.101.3.4.2.3

Используется при повышенных требованиях к стойкости.

MD5

MD5 имеет идентификатор:

1.2.840.113549.2.5

Алгоритм считается устаревшим и не используется в криптографически защищённых системах.

Представление OID в Jsrsasign

Библиотека Jsrsasign реализует работу с ASN.1 структурами, сертификатами X.509 и криптографическими алгоритмами. OID используется как связующее звено между алгоритмами хеширования и их представлением в сертификатах и подписях.

Внутреннее представление OID в Jsrsasign реализуется через строки и специализированные объекты:

var oid = "2.16.840.1.101.3.4.2.1"; // SHA-256

Связь OID и алгоритмов MessageDigest

В модуле KJUR.crypto.MessageDigest алгоритмы идентифицируются как человекочитаемыми именами, но при формировании ASN.1 структур происходит преобразование в OID.

var md = new KJUR.crypto.MessageDigest({alg: "sha256"});
var hash = md.digestString("test data");

При использовании внутри X.509 или CMS структур Jsrsasign автоматически сопоставляет:

  • sha11.3.14.3.2.26
  • sha2562.16.840.1.101.3.4.2.1
  • sha3842.16.840.1.101.3.4.2.2
  • sha5122.16.840.1.101.3.4.2.3

AlgorithmIdentifier и OID в сертификатах

В структуре X.509 каждый криптографический алгоритм представлен через AlgorithmIdentifier, включающий OID и параметры.

В Jsrsasign это реализуется через KJUR.asn1.x509.AlgorithmIdentifier:

var algId = new KJUR.asn1.x509.AlgorithmIdentifier({
  name: "sha256WithRSAEncryption"
});

В ASN.1 структурах это преобразуется в:

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

Пример итогового OID для подписи SHA-256 с RSA:

1.2.840.113549.1.1.11

Таблица соответствий хеш-алгоритмов и OID

Алгоритм OID
SHA-1 1.3.14.3.2.26
SHA-256 2.16.840.1.101.3.4.2.1
SHA-384 2.16.840.1.101.3.4.2.2
SHA-512 2.16.840.1.101.3.4.2.3
MD5 1.2.840.113549.2.5

OID в контексте цифровой подписи

При формировании подписи Jsrsasign объединяет хеш-функцию и алгоритм подписи в единый идентификатор. Например:

sha256WithRSAEncryption → 1.2.840.113549.1.1.11

Процесс включает:

  1. Вычисление хеша сообщения
  2. Применение алгоритма подписи (RSA, ECDSA)
  3. Кодирование результата в ASN.1
  4. Указание OID в структуре AlgorithmIdentifier

Разбор внутреннего механизма сопоставления

Jsrsasign использует внутренние таблицы соответствий:

KJUR.crypto.OID = {
  "sha256": "2.16.840.1.101.3.4.2.1",
  "sha384": "2.16.840.1.101.3.4.2.2",
  "sha512": "2.16.840.1.101.3.4.2.3"
};

При сериализации ASN.1 объектов происходит автоматическое преобразование:

  • строковое имя алгоритма → OID
  • OID → DER-encoded OBJECT IDENTIFIER

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

OID кодируется по правилам DER:

  • первые два числа кодируются одним байтом: 40 * X + Y
  • последующие числа кодируются base-128

Например SHA-256:

2.16.840.1.101.3.4.2.1

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

Использование OID в CMS и PKCS#7 структурах

В CMS (Cryptographic Message Syntax) OID определяет алгоритм хеширования в структуре SignedData.

Jsrsasign при формировании CMS пакета использует:

var cms = new KJUR.asn1.cms.SignedData({
  digestAlg: "sha256"
});

В итоговой структуре OID фиксирует алгоритм дайджеста, используемый для проверки подписи.

Расширяемость и пользовательские OID

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

var customOid = "1.2.3.4.5.6.7.8.9";

Такие идентификаторы применяются в экспериментальных протоколах или закрытых криптосистемах.

Ошибки несоответствия OID и алгоритма

При несогласованности OID и фактического алгоритма возникают ошибки валидации сертификатов:

  • несоответствие подписи
  • ошибка декодирования ASN.1
  • отказ проверки цепочки доверия

Jsrsasign при разборе структуры X.509 сравнивает OID с внутренним реестром алгоритмов.

Взаимодействие OID с криптографическими провайдерами

В зависимости от окружения Jsrsasign может взаимодействовать с:

  • WebCrypto API
  • Node.js crypto module
  • встроенными реализациями JS

В каждом случае OID служит универсальным идентификатором, не зависящим от конкретной реализации хеш-функции.

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

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

  • однозначную идентификацию алгоритма
  • совместимость между реализациями
  • корректную интерпретацию ASN.1 структур
  • защиту от подмены алгоритма при проверке подписи