Wat is abstracte syntaxisnotatie één (ASN.1)?

8 mei 2024

Abstract Syntax Notation One (ASN.1) is een gestandaardiseerde notatie die wordt gebruikt voor het definiëren van datastructuren die op verschillende platforms kunnen worden geserialiseerd en gedeserialiseerd. Het biedt een raamwerk voor het beschrijven van gegevens op een platformonafhankelijke manier, waardoor het cruciaal is voor communicatieprotocollen.

wat is abstracte syntaxisnotatie één

Wat is ASN.1?

Abstract Syntax Notation One (ASN.1) is een gestandaardiseerde notatie ontwikkeld door de International Telecommunication Union (ITU-T) voor het specificeren van datastructuren op een platformonafhankelijke manier. Het speelt een cruciale rol in telecommunicatie-, netwerk- en beveiligingsprotocollen door een formele taal aan te bieden om complexe zaken te beschrijven data structuren. ASN.1 scheidt de datasyntaxis van de codering, waardoor gegevens naadloos tussen verschillende systemen kunnen worden verzonden en verwerkt.

De coderingsregels, zoals Basic Encoding Rules (BER), Distinguished Encoding Rules (DER) en Packed Encoding Rules (PER), zorgen ervoor dat de geserialiseerde gegevens efficiënt worden verzonden met behoud van structurele betrouwbaarheid. ASN.1 definieert niet alleen de soorten en waarden van gegevens, maar ook hoe deze datastructuren zich tot elkaar verhouden, waardoor het onmisbaar wordt op gebieden waar nauwkeurige en interoperabele gegevensuitwisseling noodzakelijk is. Het is vooral handig in de beveiliging toepassingen, digitale certificaten en telecommunicatiestandaarden waarbij consistentie in gegevensverwerking cruciaal is.

ASN.1 Syntaxisvoorbeeld

Hier is een voorbeeld van de ASN.1-syntaxis die een eenvoudige berichtstructuur demonstreert voor een persoon met een naam en een leeftijd:

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

In dit voorbeeld de module Persoon bevat een structuur genaamd Persoonsrecord die wordt gedefinieerd als een VOLGORDE. Deze reeks bevat twee velden:

  1. naam, Een UTF8String.
  2. leeftijd, dat is een GEHEEL GETAL.

ASN.1 Coderingsvoorbeeld

Stel dat we een structuur voor een persoon willen definiëren met twee velden: naam (een tekenreeks) en leeftijd (een geheel getal). Dit zou in ASN.1 als volgt worden geschreven:

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

Gegevensvoorbeeld

Stel dat we een persoon willen vertegenwoordigen die 'Alice' heet en die 30 jaar oud is.

Coderingsvoorbeeld

Als we BER (Basic Encoding Rules) gebruiken voor het coderen, worden de gegevens voor "Alice, 30" als volgt geserialiseerd:

  1. Sequentie-ID: 0x30 (geeft een VOLGORDE aan)
  2. Lengte: 0x0C (12 bytes voor de hele reeks)
  3. UTF8String-ID: 0x0C (geeft UTF8String aan)
  4. Lengte van naam: 0x05 (5 bytes voor de naam "Alice")
  5. Waarde van naam: 0x41 0x6C 0x69 0x63 0x65 (UTF-8 gecodeerd "Alice")
  6. INTEGER-identificatie: 0x02 (geeft INTEGER aan)
  7. Lengte van leeftijd: 0x01 (1 byte voor het gehele getal)
  8. Waarde van leeftijd: 0x1E (30 in hexadecimaal)

De BER-gecodeerde gegevens zouden er dus als volgt uitzien:

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

Deze hexadecimale representatie komt overeen met de datastructuur die is gedefinieerd in ASN.1 en laat zien hoe deze kan worden gebruikt om op consistente wijze gegevens tussen systemen uit te wisselen.

ASN.1 Typen en waarden

ASN.1 (Abstract Syntax Notation One) biedt een uitgebreide set gegevenstypen en waarden om verschillende structuren op een gestandaardiseerde manier weer te geven. Deze gegevenstypen zorgen voor effectieve communicatie tussen verschillende platforms. Hier volgt een overzicht van enkele veelvoorkomende ASN.1-typen en -waarden:

GEHEEL GETAL


Een INTEGER-type vertegenwoordigt gehele waarden (zowel positief als negatief). Het kan elke grootte hebben en wordt vaak gebruikt voor numerieke identificatiegegevens of tellingen.

Voorbeeld:

age INTEGER ::= 30

BOOLAAN


Het BOOLEAN-type vertegenwoordigt logische waar of onwaar waarden. Het wordt meestal gebruikt voor vlaggen en binaire beslissingen.

Voorbeeld:

isActive BOOLEAN ::= TRUE

OCTET-STRING


Een OCTET STRING bevat een reeks octetten (bytes), vaak gebruikt voor binaire gegevens zoals afbeeldingen, bestandenof cryptografische sleutels.

Voorbeeld:

rawData OCTET STRING ::= 'E04FD020EA3A6910A2D808002B30309D'H

NULL

Het NULL-type geeft de afwezigheid van een waarde aan. Vaak gebruikt als tijdelijke aanduiding in optionele velden.

Voorbeeld:

nothing NULL ::= NULL

OBJECTIDENTIFICATIE


Een OBJECT IDENTIFIER (OID) is een wereldwijd unieke identificatie die wordt gebruikt om te verwijzen naar specifieke standaarden, protocollen of objecten.

Voorbeeld:

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

GEnummerd


Het is vergelijkbaar met een INTEGER, maar beperkt tot een vooraf gedefinieerde lijst met waarden. Het ENUMERATED-type is handig voor het weergeven van opties of statussen.

Voorbeeld:

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

UTF8String


Dit is een stringtype dat is gecodeerd met UTF-8. Het is ideaal voor het weergeven van tekstgegevens die speciale tekens of niet-Latijnse alfabetten bevatten.

Voorbeeld:

fullName UTF8String ::= "Alice Smith"

VOLGORDE


Een SEQUENTIE is een verzameling van verschillende gegevensvelden, die bij het programmeren als een structuur of record fungeren. Velden kunnen verplicht of optioneel zijn.

Voorbeeld:

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

VOLGORDE VAN


EEN SEQUENTIE VAN is een verzameling elementen van hetzelfde type, vergelijkbaar met een array.

Voorbeeld:

PhoneNumbers ::= SEQUENCE OF UTF8String

SET


Dit lijkt op een SEQUENTIE, maar de velden hoeven niet in een bepaalde volgorde te verschijnen.

Voorbeeld:

Identity SET { firstName UTF8String, lastName UTF8String }

ASN.1 Macro's

In ASN.1 zijn macro's geïntroduceerd om de specificatie van bepaalde structuren te vereenvoudigen door herbruikbare sjablonen voor datastructuren te definiëren. Hoewel macro's in latere herzieningen van ASN.1 grotendeels zijn vervangen door andere mechanismen, is het begrijpen van hun historische gebruik belangrijk bij het werken met oudere specificaties.

Macro's speelden een rol die vergelijkbaar was met functies of sjablonen in programmeertalen. Ze stelden gebruikers in staat een herbruikbaar patroon te definiëren dat waar nodig kon worden uitgebreid met specifieke details, waardoor redundantie werd verminderd en complexe definities werden vereenvoudigd.

Macro-syntaxis

Een macro wordt gedefinieerd met behulp van de volgende algemene structuur:

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

Voorbeeld van een macro

Een eenvoudig voorbeeld zou het definiëren van een macro kunnen zijn die een GetagdType:

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

Hier TYPENOTATIE en WAARDE NOTATIE zijn tijdelijke aanduidingen die worden ingevuld wanneer de macro wordt gebruikt.

Met de evolutie van ASN.1 zijn macro's vervangen door krachtigere en flexmogelijke constructies zoals geparametriseerde typen en informatieobjectklassen. Geparametriseerde typen bieden een manier om sjablonen te specificeren die kunnen worden hergebruikt met verschillende gegevenstypen, terwijl informatieobjectklassen het mogelijk maken dat beperkingen en relaties explicieter worden gespecificeerd.

ASN.1-coderingsregels

ASN.1-coderingsregels definiëren hoe datastructuren beschreven in ASN.1 moeten worden geserialiseerd en gedeserialiseerd in een binair formaat dat geschikt is voor verzending of opslag. Elke coderingsregel biedt verschillende niveaus van efficiëntie en toepasbaarheid op basis van specifieke vereisten zoals grootte, verwerkingssnelheid of striktheid.

Hier is een lijst en uitleg van enkele algemene coderingsregels in ASN.1:

  • Basiscoderingsregels (BER). BER is een flexbare coderingsregel die een TLV-indeling (type-lengte-waarde) gebruikt voor codering. Elk element begint met een ID om het type aan te geven, gevolgd door de lengte van de waarde en ten slotte de waarde zelf. BER maakt codering van onbepaalde lengte mogelijk, wat zorgt voor flexmaar kan resulteren in grotere gecodeerde gegevens vergeleken met andere regels.
  • Onderscheidende coderingsregels (DER). DER is een subset van BER die consistente codering garandeert door specifieke regels af te dwingen, zoals het gebruik van codering met de kleinst mogelijke lengte. Het biedt ondubbelzinnige binaire representaties van datastructuren. DER wordt veel gebruikt in beveiligingsprotocollen en digitale certificaten omdat het garandeert dat dezelfde ASN.1-structuur altijd op identieke wijze codeert.
  • Canonieke coderingsregels (CER). CER is ook een subset van BER die is ontworpen voor ondubbelzinnige codering. Het is vergelijkbaar met DER, maar maakt codering van bepaalde typen van onbepaalde lengte mogelijk, wat handig is voor grote datasets. CER is ideaal voor streamingtoepassingen waarbij datastructuren mogelijk niet in een vooraf gedefinieerde lengte passen.
  • Verpakte coderingsregels (PER). PER is ontworpen om zeer efficiënt te zijn door onnodige metagegevens te verwijderen. Het optimaliseert de codering door het minimale aantal bits te gebruiken dat nodig is voor elk veld, vaak gebaseerd op vooraf gedefinieerde bereiken of beperkingen. PER produceert aanzienlijk kleinere gegevensgroottes vergeleken met BER, DER en CER, waardoor het geschikt is voor bandbreedtegevoelige toepassingen zoals mobiele communicatie.
  • XML-coderingsregels (XER). XER wijst ASN.1-structuren toe aan een XML-representatie, waardoor deze voor mensen leesbaar wordt. Het heeft tot doel de interoperabiliteit te verbeteren door gebruik te maken van de populariteit van XML voor gegevensuitwisseling. XER is met name handig wanneer gegevens door mensen moeten worden beoordeeld of gewijzigd of moeten worden geïntegreerd in bestaande op XML gebaseerde workflows.

JSON-coderingsregels (JER). JER wijst ASN.1-structuren toe aan een JSON-representatie, waardoor ze leesbaar en bruikbaar worden in Webapplicaties. Het maakt gebruik van de populariteit van JSON in webservices. JER is handig voor moderne webgebaseerde systemen die afhankelijk zijn van JSON voor gegevensuitwisseling en opslag.


Anastasia
Spasojević
Anastazija is een ervaren contentschrijver met kennis en passie voor cloud computergebruik, informatietechnologie en onlinebeveiliging. Bij phoenixNAP, richt ze zich op het beantwoorden van brandende vragen over het waarborgen van de robuustheid en veiligheid van gegevens voor alle deelnemers aan het digitale landschap.