ASN.1 (Abstract Syntax Notation One) — формальная нотация описания структур данных, используемая для стандартизированного представления, кодирования и передачи информации в криптографии, телекоммуникациях и сетевых протоколах. Её ключевая задача — отделить логическое описание данных от их физического представления в памяти или при передаче по сети.
ASN.1 используется там, где критична совместимость между разными системами и языками программирования. Она описывает структуру данных независимо от платформы, а затем вместе с правилами кодирования определяет, как эти данные превращаются в последовательность байтов.
Основные области применения:
В контексте JavaScript-библиотек, таких как Jsrsasign, ASN.1 является фундаментом для работы с сертификатами, ключами и цифровыми подписями.
ASN.1 описывает данные как строгие типизированные структуры. Эти структуры могут включать:
Пример описания структуры сертификата:
Certificate ::= SEQUENCE {
tbsCertificate TBSCertificate,
signatureAlgorithm AlgorithmIdentifier,
signatureValue BIT STRING
}
SEQUENCE здесь играет роль аналога структуры или объекта, содержащего упорядоченные поля.
OID является ключевым элементом криптографии. Например:
1.2.840.113549.1.1.5
— обозначает алгоритм SHA-1 с RSA подписью.
ASN.1 сама по себе не определяет, как данные хранятся в байтах. Для этого используются правила кодирования:
Базовый универсальный способ кодирования. Использует структуру:
Подмножество BER с детерминированным результатом. Ключевые особенности:
DER особенно важен в криптографии, поскольку цифровая подпись должна быть воспроизводимой.
PEM — это Base64-обёртка над DER-данными с заголовками:
-----BEGIN CERTIFICATE-----
MIIB...
-----END CERTIFICATE-----
ASN.1 кодирование основано на модели TLV:
Пример концептуально:
30 0A 02 01 05
│ │ │ │ └─ значение (5)
│ │ │ └──── длина (1 байт)
│ │ └─────── INTEGER
│ └────────── длина SEQUENCE
└───────────── SEQUENCE
Эта структура делает ASN.1 универсальной для бинарных протоколов.
В криптографических системах ASN.1 используется как фундамент описания:
Например, сертификат X.509 представляет собой ASN.1 структуру, содержащую:
Библиотека Jsrsasign активно использует ASN.1 для:
Jsrsasign содержит встроенный ASN.1-парсер, позволяющий:
Пример использования ASN.1-парсинга:
var hex = "3082...";
var asn1 = ASN1HEX.parse(hex);
console.log(asn1);
Здесь HEX-представление DER преобразуется в древовидную структуру.
OID — это ключевая система идентификации алгоритмов и сущностей.
Примеры:
1.2.840.113549.1.1.12.16.840.1.101.3.4.2.1OID используется в сертификатах для указания:
ASN.1 играет критическую роль в безопасности, но также является источником уязвимостей при неправильной реализации:
Поэтому в криптографии предпочтение всегда отдается DER.
В JavaScript ASN.1 обычно обрабатывается через специализированные библиотеки:
В Jsrsasign ASN.1 является базовым слоем для всей криптографической логики. Без него невозможно корректно работать с:
Certificate
├── TBSCertificate
│ ├── Version
│ ├── SerialNumber
│ ├── Signature
│ ├── Issuer
│ ├── Validity
│ ├── Subject
│ └── SubjectPublicKeyInfo
├── SignatureAlgorithm
└── SignatureValue
Каждый узел этой структуры кодируется ASN.1 правилами.
Несмотря на сложность, ASN.1 сохраняет актуальность благодаря:
ASN.1 остаётся одним из ключевых элементов инфраструктуры доверия в интернете и фундаментом для работы большинства криптографических библиотек, включая Jsrsasign.