Che cos'è la notazione sintattica astratta uno (ASN.1)?

8 Maggio 2024

Abstract Syntax Notation One (ASN.1) è una notazione standardizzata utilizzata per definire strutture di dati che possono essere serializzate e deserializzate su diverse piattaforme. Fornisce un quadro per descrivere i dati in modo indipendente dalla piattaforma, rendendolo fondamentale per i protocolli di comunicazione.

che cosa è la notazione sintattica astratta uno

Cos'è l'ASN.1?

Abstract Syntax Notation One (ASN.1) è una notazione standardizzata sviluppata dall'International Telecommunication Union (ITU-T) per specificare strutture di dati in modo indipendente dalla piattaforma. Svolge un ruolo fondamentale nelle telecomunicazioni, nelle reti e nei protocolli di sicurezza offrendo un linguaggio formale per descrivere complessi strutture di dati. ASN.1 separa la sintassi dei dati dalla codifica, consentendo la trasmissione e l'elaborazione dei dati senza interruzioni tra vari sistemi.

Le sue regole di codifica, come Basic Encoding Rules (BER), Distinguished Encoding Rules (DER) e Packed Encoding Rules (PER), garantiscono che i dati serializzati vengano trasmessi in modo efficiente mantenendo la fedeltà strutturale. ASN.1 definisce non solo i tipi e i valori dei dati, ma anche il modo in cui queste strutture di dati si relazionano tra loro, rendendolo indispensabile nelle aree in cui è necessario uno scambio di dati preciso e interoperabile. È particolarmente utile in materia di sicurezza applicazioni, certificati digitali e standard di telecomunicazione in cui la coerenza nella gestione dei dati è fondamentale.

ASN.1 Esempio di sintassi

Ecco un esempio di sintassi ASN.1 che mostra una semplice struttura di messaggio per una persona con un nome ed un'età:

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

In questo esempio, il modulo Persona contiene una struttura chiamata PersonaRecord che è definito come a SEQUENZA. Questa sequenza comprende due campi:

  1. Nome, Che è un UTF8String.
  2. , che è un INTEGER.

Esempio di codifica ASN.1

Supponiamo di voler definire una struttura per una persona con due campi: Nome (una stringa) e (un numero intero). Questo verrebbe scritto in ASN.1 come segue:

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

Esempio di dati

Supponiamo di voler rappresentare una persona chiamata "Alice" che ha 30 anni.

Esempio di codifica

Se utilizziamo BER (Basic Encoding Rules) per la codifica, i dati per "Alice, 30" verrebbero serializzati come segue:

  1. Identificatore di sequenza: 0x30 (indicando una SEQUENZA)
  2. Lunghezza: 0x0C (12 byte per l'intera sequenza)
  3. Identificatore stringa UTF8: 0x0C (indicando UTF8String)
  4. Lunghezza del nome: 0x05 (5 byte per il nome "Alice")
  5. Valore del nome: 0x41 0x6C 0x69 0x63 0x65 (Codificato UTF-8 "Alice")
  6. INTERO Identificatore: 0x02 (indicando INTERO)
  7. Durata dell'età: 0x01 (1 byte per il numero intero)
  8. Valore dell'età: 0x1E (30 in esadecimale)

Pertanto, i dati codificati BER sarebbero simili a questi:

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

Questa rappresentazione esadecimale corrisponde alla struttura dati definita in ASN.1, mostrando come può essere utilizzata per scambiare dati tra sistemi in modo coerente.

ASN.1 Tipi e valori

ASN.1 (Abstract Syntax Notation One) fornisce un set completo di tipi di dati e valori per rappresentare varie strutture in modo standardizzato. Questi tipi di dati garantiscono una comunicazione efficace tra diverse piattaforme. Ecco una ripartizione di alcuni tipi e valori ASN.1 comuni:

INTEGER


Un tipo INTEGER rappresenta valori interi (sia positivi che negativi). Può essere di qualsiasi dimensione e viene spesso utilizzato per identificatori o conteggi numerici.

Esempio:

age INTEGER ::= 30

BOOLEAN


La Tipo BOOLEAN rappresenta valori logici veri o falsi. Viene generalmente utilizzato per flag e decisioni binarie.

Esempio:

isActive BOOLEAN ::= TRUE

STRINGA DI OTTETTO


Una STRINGA DI OTTETTI contiene una sequenza di ottetti (bytes), comunemente usato per dati binari come immagini, fileo chiavi crittografiche.

Esempio:

rawData OCTET STRING ::= 'E04FD020EA3A6910A2D808002B30309D'H

NULL

Il tipo NULL indica l'assenza di un valore. Spesso utilizzato come segnaposto nei campi facoltativi.

Esempio:

nothing NULL ::= NULL

IDENTIFICATORE DELL'OGGETTO


Un IDENTIFICATORE DI OGGETTO (OID) è un identificatore univoco globale utilizzato per fare riferimento a standard, protocolli o oggetti specifici.

Esempio:

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

NUMERATO


È simile a un INTEGER ma vincolato a un elenco predefinito di valori. Il tipo ENUMERATED è utile per rappresentare opzioni o stati.

Esempio:

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

UTF8String


Questo è un tipo di stringa codificato utilizzando UTF-8. È ideale per rappresentare dati testuali contenenti caratteri speciali o alfabeti non latini.

Esempio:

fullName UTF8String ::= "Alice Smith"

SEQUENZA


Una SEQUENZA è una raccolta di diversi campi dati, che agisce come una struttura o un record nella programmazione. I campi possono essere obbligatori o facoltativi.

Esempio:

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

SEQUENZA DI


UNA SEQUENZA DI è una raccolta di elementi dello stesso tipo, simile ad un array.

Esempio:

PhoneNumbers ::= SEQUENCE OF UTF8String

SET


È come una SEQUENZA, ma i suoi campi non devono necessariamente apparire in un ordine particolare.

Esempio:

Identity SET { firstName UTF8String, lastName UTF8String }

Macro ASN.1

In ASN.1 sono state introdotte macro per semplificare la specifica di determinate strutture definendo modelli riutilizzabili per le strutture dati. Sebbene le macro siano state in gran parte sostituite da altri meccanismi nelle revisioni successive di ASN.1, comprenderne l'uso storico è importante per lavorare con le specifiche più vecchie.

Le macro svolgevano un ruolo simile alle funzioni o ai modelli in linguaggi di programmazione. Hanno consentito agli utenti di definire un modello riutilizzabile che poteva essere ampliato con dettagli specifici laddove necessario, riducendo così la ridondanza e semplificando le definizioni complesse.

Sintassi macro

Una macro viene definita utilizzando la seguente struttura generale:

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

Esempio di una macro

Un semplice esempio potrebbe comportare la definizione di una macro che crea un file Tipo con tag:

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

Qui, NOTAZIONE DEL TIPO e NOTAZIONE DI VALORE sono segnaposto che vengono compilati quando viene utilizzata la macro.

Con l'evoluzione di ASN.1, le macro sono state sostituite da macro più potenti e flexcostrutti variabili come tipi parametrici e classi di oggetti informativi. I tipi con parametri forniscono un modo per specificare modelli che possono essere riutilizzati con diversi tipi di dati, mentre le classi di oggetti informazioni consentono di specificare vincoli e relazioni in modo più esplicito.

ASN.1 Regole di codifica

Le regole di codifica ASN.1 definiscono il modo in cui le strutture di dati descritte in ASN.1 devono essere serializzate e deserializzate in un formato binario adatto alla trasmissione o all'archiviazione. Ciascuna regola di codifica fornisce diversi livelli di efficienza e applicabilità in base a requisiti specifici come dimensioni, velocità di elaborazione o rigore.

Ecco un elenco e una spiegazione di alcune regole di codifica comuni in ASN.1:

  • Regole di codifica di base (BER). BER è un flexregola di codifica flessibile che utilizza un formato tipo-lunghezza-valore (TLV) per la codifica. Ogni elemento inizia con un identificatore per indicarne il tipo, seguito dalla lunghezza del valore e infine dal valore stesso. BER consente la codifica a lunghezza indefinita, che fornisce flexbilità ma può comportare dati codificati più grandi rispetto ad altre regole.
  • Regole di codifica distinte (DER). DER è un sottoinsieme di BER che garantisce una codifica coerente applicando regole specifiche, come l'utilizzo della codifica con la lunghezza più piccola possibile. Fornisce rappresentazioni binarie inequivocabili delle strutture dati. DER è ampiamente utilizzato nei protocolli di sicurezza e nei certificati digitali perché garantisce che la stessa struttura ASN.1 codifichi sempre in modo identico.
  • Regole di codifica canonica (CER). CER è anche un sottoinsieme di BER progettato per una codifica univoca. È simile a DER ma consente la codifica di lunghezza indefinita di alcuni tipi, utile per set di dati di grandi dimensioni. CER è ideale per le applicazioni di streaming in cui le strutture dei dati potrebbero non rientrare in una lunghezza predefinita.
  • Regole di codifica compresse (PER). PER è progettato per essere altamente efficiente rimuovendo i metadati non necessari. Ottimizza la codifica utilizzando il numero minimo di bit necessari per ciascun campo, spesso in base a intervalli o vincoli predefiniti. PER produce dati di dimensioni significativamente più piccole rispetto a BER, DER e CER, rendendolo adatto per applicazioni sensibili alla larghezza di banda come le comunicazioni mobili.
  • Regole di codifica XML (XER). XER mappa le strutture ASN.1 su una rappresentazione XML, rendendola leggibile dall'uomo. Mira a migliorare l'interoperabilità sfruttando la popolarità di XML per lo scambio di dati. XER è particolarmente utile laddove i dati devono essere rivisti o modificati da esseri umani o integrati in flussi di lavoro esistenti basati su XML.

Regole di codifica JSON (JER). JER mappa le strutture ASN.1 in una rappresentazione JSON, rendendole leggibili e utilizzabili in applicazioni web. Sfrutta la popolarità di JSON nei servizi web. JER è utile per i moderni sistemi basati sul Web che si affidano a JSON per lo scambio e l'archiviazione dei dati.


Anastasia
Spasojevic
Anastazija è una scrittrice di contenuti esperta con conoscenza e passione per cloud informatica, informatica e sicurezza online. A phoenixNAP, si concentra sulla risposta a domande scottanti su come garantire la robustezza e la sicurezza dei dati per tutti i partecipanti al panorama digitale.