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

8 de mayo de 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 la notación de sintaxis abstracta?

¿Qué es ASN.1?

La Notación Sintáctica 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 forma independiente de la plataforma. Desempeña un papel fundamental en las telecomunicaciones, las redes y los protocolos de seguridad al ofrecer un lenguaje formal para describir estructuras de datos complejas . 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 diversos 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 la transmisión eficiente de los datos serializados, manteniendo la fidelidad estructural. ASN.1 define no solo los tipos y valores de los datos, sino también cómo se relacionan entre sí estas estructuras de datos, lo que lo hace indispensable en áreas donde se requiere un intercambio de datos preciso e interoperable. Resulta especialmente útil en aplicaciones de seguridad , 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 Person contiene una estructura llamada PersonRecord que se define como una 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 cadena de caracteres) 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


El 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 una función similar a la de las funciones o plantillas en los lenguajes de programación . Permitían a los usuarios definir un patrón reutilizable que podía ampliarse con detalles específicos donde 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 consistir en definir una macro que cree un TaggedType :

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

Aquí, NOTACIÓN DE TIPO y NOTACIÓN DE VALOR son marcadores de posición que se rellenan 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, lo que permite leerlas y utilizarlas en aplicaciones web . Aprovecha la popularidad de JSON en los servicios web. JER es útil para sistemas web modernos 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.