XML-canonicalisatie (C14N)

XML-canonicalisatie (C14N) zet een XML-document om in een vaste bytevorm, zodat opmaakverschillen een handtekening nooit breken.

XML-canonicalisatie, meestal afgekort tot C14N, is het proces waarbij een XML-document wordt omgezet naar een exacte, gestandaardiseerde bytereeks, zodat documenten die alleen in opmaak verschillen na canonicalisatie identiek zijn. Het gaat daarbij om verschillen zoals:

  • witruimte tussen elementen en attributen
  • de volgorde waarin attributen staan
  • overbodige of anders geordende namespace-declaraties
  • regeleindes
  • tekencodering

XML laat toe dat dezelfde logische inhoud op veel verschillende manieren wordt geschreven; een hash werkt niet op die manier, want die behandelt de invoer als een kale reeks bytes en elk verschil levert een volledig ander resultaat op.

Dat verschil is van belang voor XML signature (XMLDSig) en XAdES: een handtekening wordt berekend over een hash van de data, dus als de exacte bytes verschuiven - omdat een andere XML-parser het document opnieuw heeft geserialiseerd, of een tool het opnieuw heeft ingesprongen - lijkt de handtekening kapot terwijl er inhoudelijk niets is veranderd. Canonicalisatie neemt die kwetsbaarheid weg door de bytevorm vast te leggen voordat er gehasht wordt, zowel bij het ondertekenen als bij het verifieren.

Drie verwante standaarden spelen hierbij een rol:

  • Canonical XML 1.0: de oorspronkelijke W3C-standaard, die de canonieke vorm definieert voor een compleet XML-document of een welgevormd deel daarvan.
  • Canonical XML 1.1: een latere herziening die corrigeert hoe overgeerfde xml:-attributen (zoals xml:lang en xml:base) worden behandeld wanneer slechts een deel van een document wordt gecanonicaliseerd.
  • Exclusive XML canonicalization: een variant voor het ondertekenen van een XML-fragment dat zich in een groter document bevindt, of daarin zal worden verplaatst, zodat namespace-declaraties uit de omringende context niet doorlekken naar de canonieke vorm en de handtekening later ongeldig maken.

Let op: Canonicalisatie levert alleen een interne bytereeks op om de hash te berekenen; het herschrijft niet het bestand dat wordt opgeslagen, verzonden of getoond. Een ondertekend XML-document kan voor leesbaarheid gewoon anders worden opgemaakt zonder de handtekening aan te tasten, mits de canonicalisatiestap bij validatie correct wordt herhaald.

Veelgestelde vragen

Terug naar begrippenlijst