¿Qué es la notación de sintaxis abstracta uno (ASN.1)?

8 de mayo del 2024

La notación de sintaxis abstracta uno (ASN.1) es una notación estandarizada que se utiliza para definir estructuras de datos que se pueden serializar y deserializar en diferentes plataformas. Proporciona un marco para describir datos de forma independiente de la plataforma, lo que lo hace crucial para los protocolos de comunicación.

¿Qué es ASN.1?

La notación de sintaxis abstracta uno (ASN.1) es una notación estandarizada desarrollada por la Unión Internacional de Telecomunicaciones (UIT-T) para especificar estructuras de datos de manera independiente de la plataforma. Desempeña un papel fundamental en los protocolos de telecomunicaciones, redes y seguridad al ofrecer un lenguaje formal para describir complejos estructuras de datos. ASN.1 separa la sintaxis de los datos de la codificación, lo que permite que los datos se transmitan y procesen sin problemas en varios sistemas.

Sus reglas de codificación, como las reglas de codificación básica (BER), las reglas de codificación distinguida (DER) y las reglas de codificación empaquetada (PER), garantizan que los datos serializados se transmitan de manera eficiente manteniendo la fidelidad estructural. ASN.1 define no sólo los tipos y valores de datos, sino también cómo estas estructuras de datos se relacionan entre sí, lo que lo hace indispensable en áreas donde es necesario un intercambio de datos preciso e interoperable. Es especialmente útil en seguridad. aplicaciones, certificados digitales y estándares de telecomunicaciones donde la coherencia en el manejo de datos es crucial.

Ejemplo de sintaxis ASN.1

A continuación se muestra un ejemplo de sintaxis ASN.1 que muestra una estructura de mensaje simple para una persona con un nombre y una edad:

Person DEFINITIONS ::= BEGIN PersonRecord ::= SEQUENCE { name UTF8String, age INTEGER } END

En este ejemplo, el módulo Persona contiene una estructura llamada Registro de persona que se define como un SECUENCIA. Esta secuencia incluye dos campos:

  1. nombre , Que es un Cadena UTF8.
  2. edad , que es un INTEGER.

Ejemplo de codificación ASN.1

Supongamos que queremos definir una estructura para una persona con dos campos: nombre (una cuerda) y edad (un número entero). Esto se escribiría en ASN.1 de la siguiente manera:

Person DEFINITIONS ::= BEGIN PersonRecord ::= SEQUENCE { name UTF8String, age INTEGER } END

Ejemplo de datos

Supongamos que queremos representar a una persona llamada "Alice" que tiene 30 años.

Ejemplo de codificación

Si utilizamos BER (Reglas básicas de codificación) para codificar, los datos de "Alice, 30" se serializarían de la siguiente manera:

  1. Identificador de secuencia: 0x30 (indicando una SECUENCIA)
  2. Longitud Mínima: 0x0C (12 bytes para toda la secuencia)
  3. Identificador de cadena UTF8: 0x0C (indicando UTF8String)
  4. longitud del nombre: 0x05 (5 bytes para el nombre "Alice")
  5. valor del nombre: 0x41 0x6C 0x69 0x63 0x65 (Codificación UTF-8 "Alice")
  6. Identificador ENTERO: 0x02 (indicando ENTERO)
  7. Duración de la edad: 0x01 (1 byte para el número entero)
  8. valor de la edad: 0x1E (30 en hexadecimal)

Por tanto, los datos codificados con BER tendrían este aspecto:

30 0C 0C 05 41 6C 69 63 65 02 01 1E

Esta representación hexadecimal corresponde a la estructura de datos definida en ASN.1, que muestra cómo se puede utilizar para intercambiar datos entre sistemas de manera consistente.

ASN.1 Tipos y valores

ASN.1 (Notación de sintaxis abstracta uno) proporciona un conjunto completo de tipos de datos y valores para representar varias estructuras de forma estandarizada. Estos tipos de datos garantizan una comunicación eficaz entre diferentes plataformas. Aquí hay un desglose de algunos tipos y valores comunes de ASN.1:

INTEGER


Un tipo INTEGER representa valores enteros (tanto positivos como negativos). Puede ser de cualquier tamaño y se utiliza a menudo para identificadores numéricos o recuentos.

Ejemplo:

age INTEGER ::= 30

Booleano


La tipo booleano representa valores lógicos verdaderos o falsos. Normalmente se utiliza para banderas y decisiones binarias.

Ejemplo:

isActive BOOLEAN ::= TRUE

CUERDA DE OCTETOS


Una OCTET STRING contiene una secuencia de octetos (bytes), comúnmente utilizado para datos binarios como imágenes, archivos, o claves criptográficas.

Ejemplo:

rawData OCTET STRING ::= 'E04FD020EA3A6910A2D808002B30309D'H

NULL

El tipo NULL significa la ausencia de un valor. A menudo se utiliza como marcador de posición en campos opcionales.

Ejemplo:

nothing NULL ::= NULL

IDENTIFICADOR DE OBJETO


Un IDENTIFICADOR DE OBJETO (OID) es un identificador único global que se utiliza para hacer referencia a estándares, protocolos u objetos específicos.

Ejemplo:

myObjectIdentifier OBJECT IDENTIFIER ::= { iso member-body us(1) ansi-x9-57(100) }

ENUMERADO


Es similar a un INTEGER pero restringido a una lista predefinida de valores. El tipo ENUMERADO es útil para representar opciones o estados.

Ejemplo:

status ENUMERATED { active(0), inactive(1), pending(2) }

Cadena UTF8


Este es un tipo de cadena codificado usando UTF-8. Es ideal para representar datos textuales que contienen caracteres especiales o alfabetos no latinos.

Ejemplo:

fullName UTF8String ::= "Alice Smith"

SECUENCIA


UNA SECUENCIA es una colección de diferentes campos de datos, que actúan como una estructura o registro en programación. Los campos pueden ser obligatorios u opcionales.

Ejemplo:

PersonRecord ::= SEQUENCE { name UTF8String, age INTEGER, address UTF8String OPTIONAL }

SECUENCIA DE


UNA SECUENCIA DE es una colección de elementos del mismo tipo, similar a una matriz.

Ejemplo:

PhoneNumbers ::= SEQUENCE OF UTF8String

SET


Esto es como una SECUENCIA, pero no es necesario que sus campos aparezcan en un orden particular.

Ejemplo:

Identity SET { firstName UTF8String, lastName UTF8String }

Macros ASN.1

En ASN.1, se introdujeron macros para simplificar la especificación de ciertas estructuras mediante la definición de plantillas reutilizables para estructuras de datos. Aunque las macros han sido reemplazadas en gran medida por otros mecanismos en revisiones posteriores de ASN.1, comprender su uso histórico es importante para trabajar con especificaciones más antiguas.

Las macros cumplían un papel similar a las funciones o plantillas en lenguajes de programación. Permitieron a los usuarios definir un patrón reutilizable que podría ampliarse con detalles específicos cuando fuera necesario, reduciendo así la redundancia y simplificando definiciones complejas.

Sintaxis de macros

Una macro se define utilizando la siguiente estructura general:

MyMacro MACRO ::= BEGIN -- Macro definition content goes here END

Ejemplo de una macro

Un ejemplo sencillo podría implicar la definición de una macro que cree una Tipo etiquetado:

TaggedType MACRO ::= BEGIN TYPE NOTATION ::= Type VALUE NOTATION ::= value INTEGER END

Aquí, NOTACIÓN DE TIPO e NOTACIÓN DE VALOR son marcadores de posición que se completan cuando se utiliza la macro.

Con la evolución de ASN.1, las macros han sido reemplazadas por otras más potentes y flexconstrucciones posibles como tipos parametrizados y clases de objetos de información. Los tipos parametrizados proporcionan una forma de especificar plantillas que se pueden reutilizar con diferentes tipos de datos, mientras que las clases de objetos de información permiten especificar restricciones y relaciones de forma más explícita.

Reglas de codificación ASN.1

Las reglas de codificación ASN.1 definen cómo las estructuras de datos descritas en ASN.1 deben serializarse y deserializarse en un formato binario adecuado para su transmisión o almacenamiento. Cada regla de codificación proporciona diferentes niveles de eficiencia y aplicabilidad según requisitos específicos como el tamaño, la velocidad de procesamiento o el rigor.

Aquí hay una lista y explicación de algunas reglas de codificación comunes en ASN.1:

  • Reglas básicas de codificación (BER). BER es un flexRegla de codificación compatible que utiliza un formato tipo-longitud-valor (TLV) para la codificación. Cada elemento comienza con un identificador para indicar su tipo, seguido de la longitud del valor y, finalmente, el valor en sí. BER permite la codificación de longitud indefinida, lo que proporciona flexibilidad, pero puede dar como resultado datos codificados más grandes en comparación con otras reglas.
  • Reglas de codificación distinguida (DER). DER es un subconjunto de BER que garantiza una codificación coherente al hacer cumplir reglas específicas, como utilizar la codificación de longitud más pequeña posible. Proporciona representaciones binarias inequívocas de estructuras de datos. DER se usa ampliamente en protocolos de seguridad y certificados digitales porque garantiza que la misma estructura ASN.1 siempre codifique de manera idéntica.
  • Reglas de codificación canónica (CER). CER también es un subconjunto de BER diseñado para una codificación inequívoca. Es similar a DER pero permite la codificación de longitud indefinida de algunos tipos, lo que resulta útil para grandes conjuntos de datos. CER es ideal para aplicaciones de streaming donde las estructuras de datos pueden no caber en una longitud predefinida.
  • Reglas de codificación empaquetadas (PER). PER está diseñado para ser altamente eficiente al eliminar metadatos innecesarios. Optimiza la codificación utilizando la cantidad mínima de bits necesarios para cada campo, a menudo en función de rangos o restricciones predefinidos. PER produce tamaños de datos significativamente más pequeños en comparación con BER, DER y CER, lo que lo hace adecuado para aplicaciones sensibles al ancho de banda, como las comunicaciones móviles.
  • Reglas de codificación XML (XER). XER asigna estructuras ASN.1 a una representación XML, haciéndola legible por humanos. Su objetivo es mejorar la interoperabilidad aprovechando la popularidad de XML para el intercambio de datos. XER es particularmente útil cuando los datos deben ser revisados ​​o modificados por humanos o integrados en flujos de trabajo existentes basados ​​en XML.

Reglas de codificación JSON (JER). JER asigna estructuras ASN.1 a una representación JSON, haciéndolas legibles y utilizables en aplicaciones web. Aprovecha la popularidad de JSON en los servicios web. JER es útil para sistemas modernos basados ​​en web que dependen de JSON para el intercambio y almacenamiento de datos.


Anastasia
Spasojevic
Anastazija es una escritora de contenido experimentada con conocimiento y pasión por cloud informática, tecnología de la información y seguridad en línea. En phoenixNAP, se centra en responder preguntas candentes sobre cómo garantizar la solidez y seguridad de los datos para todos los participantes en el panorama digital.