Openbaar maken zonder de signatuur te verliezen

Openbaar maken zonder de signatuur te verliezen

Iedereen die een productpas leest, krijgt dezelfde openbare gegevens te zien; sommigen krijgen daarnaast ook beveiligde velden te zien. De vraag die stilletjes opkomt, is of deze extra velden hun authenticiteit kunnen aantonen. We ondertekenen elk veld afzonderlijk, zodat ook een openbaar gemaakt veld tegen een openbare sleutel kan worden geverifieerd - offline, zonder dat er bij ons navraag hoeft te worden gedaan.

Een digitaal productpaspoort toont niet voor iedereen hetzelfde. Een kopster ziet de openbare gegevens. Een reparatiebedrijf of een revisiebedrijf ziet meer. Een markttoezichtautoriteit ziet alles. Dat is duidelijk, en de Europese normen schrijven dit inmiddels uitdrukkelijk voor.

De interessante vraag is subtieler: als iemand naast de openbare gegevens ook toegang krijgt tot beveiligde velden, kan hij dan aantonen dat juist deze velden authentiek zijn? Of moet hij erop vertrouwen dat het platform ze correct heeft geselecteerd en ongewijzigd heeft doorgegeven?

Bij de meeste platforms luidt het eerlijke antwoord: vertrouwen. Wij hebben het onze zo gebouwd dat het antwoord ‘bewijs’ is - niet alleen voor de openbare velden, maar voor elk veld dat pas bij de openbaarmaking wordt toegevoegd. Waarom dit verschil ertoe doet, en waarom we hiervoor de meer omslachtige weg hebben gekozen.

De toegangsregel wordt door iedereen op dezelfde manier nageleefd

EN 18239, de Europese norm voor toegangsrechten, beveiliging en vertrouwelijkheid in het DPP, vereist toegangsbeheer per gegevenselement: voor elk veld geldt een regel die bepaalt wie het mag inzien. Dat is de juiste eis, en die is niet moeilijk na te leven. Welke status deze normen überhaupt hebben, hebben we onder geharmoniseerde normen uiteengezet.

De gebruikelijke manier om dit te bereiken is filtering aan de serverzijde. De server weet wie er een verzoek indient, controleert wat deze persoon mag zien en levert precies dat fragment terug. Toegangsbeheer: geregeld. Meer vraagt de norm niet.

Er zit echter een addertje onder het gras waar de norm geen rekening mee houdt: Het fragment komt onondertekend binnen. De lezer krijgt een speciaal voor hem samengesteld overzicht te zien en moet erop vertrouwen dat de server eerlijk heeft geselecteerd en onderweg niets heeft gewijzigd. Voor een openbaar informatieblad is dat prima. Voor een waarde waarop een verwerker direct de prijs van een gebruikte batterij baseert, is dat wel een groot vertrouwen.

Waar een enkele handtekening zijn grenzen bereikt

De voor de hand liggende oplossing is om de gegevens te ondertekenen. Voor de twee uitersten van het spectrum werkt een gewone handtekening goed: de openbare weergave ondertekenen, de volledige dataset ondertekenen, en beide controleren aan de hand van een openbare sleutel, zonder dat er een server tussen zit. Hoe dit in detail in zijn werk gaat, staat beschreven in Handtekeningen en certificaten in het DPP.

In het midden gaat het mis. Een handtekening over het gehele document dekt precies één set velden, namelijk die welke bij het ondertekenen aanwezig waren. Als je een bevoegde lezer een beschermd veld extra openstelt, valt dit veld buiten de ondertekende set en komt het ongedekt bij hem aan. Als je in plaats daarvan vanaf het begin de volledige gegevensset ondertekent, dekt de handtekening weliswaar alles, maar dan zou je ook aan iedereen alles moeten laten zien.

De tussenliggende niveaus vallen daarmee buiten de boot: de reparateur, de verzekeraar, de recycler. Als men elke mogelijke combinatie van ‘wie-ziet-wat’ van tevoren zou willen ondertekenen, zou men per combinatie een eigen ondertekend document nodig hebben, en het aantal combinaties explodeert met elke extra toegangsgroep. Dat doet niemand. Men valt dan terug op het ongesigneerde serverfilter, en de tussenliggende schakel berust weer op vertrouwen.

Elk veld afzonderlijk ondertekenen

Er is een betere opzet, en daarop bouwen we het platform. In plaats van het voltooide document als één blok te ondertekenen, legt de uitgever zich in één enkele ondertekeningsronde afzonderlijk vast op elk veld (voor degenen die bekend zijn met de normen: het W3C-certificaat ecdsa-sd-2023 voor selectieve openbaarmaking).

Elke weergave begint bij de openbare kern

Elke weergave begint dus met dezelfde openbare velden. Wat een lezer daarbuiten te zien krijgt, wordt veld voor veld toegevoegd, en elk van deze velden leidt nog steeds terug naar de openbare sleutel van de uitgever - offline, zonder opnieuw te ondertekenen en zonder vertrouwen in de instantie die de weergave heeft samengesteld. De velden waarvoor geen aanspraak bestaat, ontbreken simpelweg. Niet zwartgemaakt, maar helemaal niet aanwezig, en er sijpelt niets over door.

Waarom ‘ononderbroken’ juist het hele punt is

Stel je een notaris voor die niet de brief in zijn geheel waarmerkt, maar elke alinea afzonderlijk. Iedereen krijgt de openbare brief. Wie recht heeft op meer, krijgt de extra alinea’s erbij, en elk daarvan draagt nog steeds het zegel van dezelfde notaris. Bij de gebruikelijke werkwijze typt het platform deze alinea’s voor u over, en wat bij u aankomt, draagt alleen nog uw woord.

Waarom ‘ononderbroken’ daarbij zo belangrijk is, verdient nog een zin extra. Een intact zegel zegt niet dat de inhoud waar is. Het zegt: dit is precies wat de opsteller heeft geschreven, en sindsdien heeft niemand er ook maar iets aan veranderd. Daarmee valt iedereen buiten de vertrouwenskwestie die het document alleen maar heeft doorgegeven - de tussenopslag, het netwerk, het archief, wij. Wie u het paspoort heeft gegeven, doet er niet meer toe.

En een zegel is binair. Het is intact of niet, een half gebroken zegel bestaat niet. Als het breekt, weet u niet welke zin is gewijzigd, maar alleen dat u het hele document niet meer kunt vertrouwen. Daarom is het geen gradueel verschil of de extra velden met hun zegel bij u aankomen of zonder: zonder zegel zijn ze niet iets minder gedocumenteerd, ze zijn helemaal niet gedocumenteerd.

Beide methoden om te bekijken

Iedereen kan dit zelf controleren. De Transpareo Time Machine is onze open-source weergave-app voor productpaspoorten: deze bladert door de versiegeschiedenis van een paspoort en berekent daarbij elke handtekening in de browser van de kijker, zonder een server van ons te raadplegen. Er zijn twee voorbeeldpassen openbaar beschikbaar. De pas van een T-shirt bevat een handtekening over het gehele document, de pas van een batterij de veldgewijze openbaarmaking.

Beide zijn open W3C-specificaties: eddsa-jcs-2022 voor de handtekening over het gehele document, ecdsa-sd-2023 voor de veldgewijze openbaarmaking. Iedereen die dat wil, kan deze implementeren. De inspanning die het kost, is de reden waarom velen het niet zullen doen: de handtekening over het gehele document is aanzienlijk goedkoper om te bouwen en te onderhouden, en wie alleen openbare gegevens verstrekt, kan daarmee volstaan.

Dat de Time Machine beide methoden beheerst, is opzettelijk en blijft zo. Ze behoort niet tot één platform. Een controleur die alleen de duurdere methode accepteert, zou een instrument zijn voor ons en voor niemand anders.

Aan wie de beveiligde velden worden vrijgegeven

Het is de moeite waard om je af te vragen aan wie er überhaupt iets wordt vrijgegeven dat verder gaat dan de openbare gegevens. Niet de toevallige koper, die krijgt het openbare paspoort. Het zijn de verwerker die beoordeelt wat een gebruikt accupakket waard is, de verzekeraar die een risico inprijst, de recycler die chemische stoffen sorteert, de overheidsinstantie die een zaak opbouwt. Dat zijn de lezers wier beslissingen afhangen van geld of veiligheid.

En het zijn precies die velden die in de gebruikelijke aanpak onbedekt blijven. Wie de meeste reden zou hebben om een cryptografisch bewijs te willen, krijgt dat juist niet voor de velden die bepalend zijn voor zijn beslissing.

Wij vinden dat een keurmerk voor iedereen hetzelfde moet betekenen. „Gecontroleerd door Transpareo“ betekent in het uitgebreide overzicht van een reparatiebedrijf hetzelfde als op het openbare certificaat van een koperster: elk getoond onderdeel is afkomstig van de uitgever en is sindsdien niet meer aangeraakt. Een keurmerk dat alleen voor de openbare velden geldt, is een half keurmerk.

Meer dan de norm vereist

We zeggen het openlijk: niets hiervan is voorgeschreven. EN 18239 vereist dat de toegang wordt gecontroleerd, en een filter aan de serverzijde regelt de toegang feilloos. Ook het cryptografisch verifieerbaar maken van de openbaar gemaakte velden is iets wat wij er bovenop doen, geen vakje dat de regelgeving van ons eist.

Juist daarom is het de moeite waard om op te schrijven. Het zou gemakkelijk zijn om aan de letter van de norm te voldoen, het serverfilter te leveren en deze stap als afgehandeld te beschouwen. Wij geven er de voorkeur aan dat de toezegging overal geldt waar het keurmerk verschijnt. Want de hele zin van een gesigneerd paspoort is dat niemand het platform hoeft te vertrouwen. Door het middelste niveau als uitzondering te schrappen, haal je precies dat vertrouwen terug dat de handtekening juist moest wegnemen.

Hetzelfde principe zorgt ervoor dat een veld wordt vergeten

Het afzonderlijk vastleggen van elk veld brengt een tweede eigenschap met zich mee, en die wordt daadwerkelijk door het Europese recht vereist. De Algemene Verordening Gegevensbescherming geeft mensen het recht om persoonsgegevens te laten verwijderen. Een gegevensset die als één blok is ondertekend, kan hier niet aan voldoen zonder de eigen handtekening te vernietigen.

Omdat elk veld hier op zichzelf staat, kan een enkel veld worden verwijderd, terwijl de rest nog steeds geverifieerd kan worden. Als er per ongeluk persoonsgegevens in een paspoort terechtkomen, worden deze netjes weer verwijderd en blijft het paspoort geldig: geen heruitgifte, geen verscheurde geschiedenis. De wettelijk verplichte velden die volgens de wet bewaard moeten blijven, blijven staan; wat verwijderbaar is, kan op verzoek worden verwijderd, zelfs jaren later.

Toch blijft het een heel gewoon paspoort

Niets van dit alles maakt van het paspoort een speciaal object dat alleen met onze tools kan worden geopend. Het blijft een Verifiable Credential in JSON-LD, het formaat waar de wereld van de webstandaarden naartoe evolueert, en dezelfde vorm die het UN Transparency Protocol en de rest van de W3C-omgeving gebruiken.

Het paspoort dat een koper in de browser scant, is dus hetzelfde object dat een dataroompartner kan inlezen, en elke normconforme controleur kan het controleren, niet alleen die van ons. De extra beveiliging kost de lezer niets en bindt niemand aan ons.

Waarom dit technisch moeilijk is

Om te beginnen, zodat er geen verkeerde indruk ontstaat: wij hebben de methode niet uitgevonden. ecdsa-sd-2023 is een openbare W3C-specificatie; de cryptografie erachter is niet van ons, en wie deze wil implementeren, kan daarover meer lezen. Het is niet moeilijk om het idee te bedenken. Het is moeilijk om het zo te bouwen dat een pas over tien jaar nog steeds kan worden gecontroleerd. Daar zit het werk, en daar valt iets nuttigs over te zeggen.

Het verschil klinkt klein, maar verschuift de basis: een gewone handtekening berekent op basis van de bytes van een document. Selectieve openbaarmaking berekent op basis van de uitspraken. Het paspoort wordt vóór het ondertekenen in een gestandaardiseerde vorm gebracht, waarin elke gegevensvermelding als een afzonderlijke, op zichzelf staande zin voorkomt. Pas daardoor kan een zin worden weggelaten zonder de overige te beschadigen.

Daarmee krijg je een probleem dat een byte-handtekening niet heeft: dezelfde gestandaardiseerde vorm moet over tien jaar weer exact hetzelfde zijn. Niet ongeveer, maar teken voor teken, anders klopt het bewijs niet meer. Drie dingen staan dit in de weg, en alle drie zijn onopvallend.

Getallen verliezen hun type. Als je een getal als louter JSON schrijft, gaat onderweg verloren wat voor getal het was. Een waarde als 2,0 komt na een ronde door JSON terug als 2. Voor een mens is dat hetzelfde, voor de gestandaardiseerde vorm is het een andere zin, en de controle mislukt.

Benamingen zijn nog geen betekenis. Om de gestandaardiseerde vorm te verkrijgen, moet elke veldnaam naar een eenduidige betekenis verwijzen. Ontbreekt er een, verdwijnt het veld bij de conversie stilletjes. Het staat dan wel in het paspoort, maar het bewijs dekt het niet, en niemand merkt het.

Betekenissen zijn doorgaans op het internet te vinden. Deze koppeling staat in een vocabulaire dat de meeste tools tijdens het controleren via het internet ophalen. Wie dat doet, maakt de controleerbaarheid van zijn paspoort afhankelijk van het feit dat een extern adres over tien jaar nog steeds reageert, en wel ongewijzigd.

Hoe wij het hebben opgelost

We hebben de drie knelpunten bij de bron aangepakt, in plaats van ze later op te vangen.

Typen. Elke waarde wordt met zijn type geschreven, en de publicatie wordt afgebroken zodra er in de gestandaardiseerde vorm ook maar één getal zonder type opduikt. De fout komt zo terecht waar hij één regel kost, in plaats van jaren later als een onverklaarbare controlefout.

Woordenlijsten. Elke woordenlijst waarnaar een pas verwijst, is bij ons lokaal beschikbaar en wordt nooit via het internet opgehaald. Een onbekend adres leidt tot een harde afbreking tijdens het ondertekenen, geen stille terugval naar een leeg resultaat.

Identificatiecodes. Elk knooppunt in het document draagt een stabiele identificatiecode, zodat de gestandaardiseerde vorm reproduceerbaar blijft, in plaats van bij elke doorloop nieuwe hulpnamen toe te wijzen.

Het meest delicate onderdeel zit in ‘Bring Your Own Key’. Voor elke uitgifte is een extra, kortstondige sleutel nodig, waarmee de openbaar te maken velden afzonderlijk worden ondertekend. Deze sleutel wordt door de uitgever zelf gegenereerd en vervolgens vernietigd. Als deze sleutel bij ons zou liggen, zouden we achteraf afzonderlijke velden kunnen verzinnen, en zou de onafhankelijkheid van de handtekening van de uitgever slechts een bewering zijn. We controleren het teruggezonden bewijs aan de hand van de opgeslagen openbare sleutel, voordat we het vertrouwen.

Elk paspoort bevat twee van dergelijke bewijzen: één van de uitgever en één van Transpareo, en elk daarvan wordt onafhankelijk afgeleid voor de weergave op een lezer. Twee handtekeningen, twee van elkaar onafhankelijke autoriteiten, zelfs voor één afzonderlijk openbaar gemaakt veld.

Voor ons is deze inspanning op de juiste plaats. We hebben de controleerbaarheid niet achteraf toegevoegd; het platform is vanaf de eerste versie hieromheen opgebouwd. Elk paspoort wordt bij publicatie ondertekend en aan de vorige versie gekoppeld. Het onveranderlijke tienjarige archief is aangelegd en treedt in werking zodra de paspoorten bij het EU-DPP-register zijn geregistreerd. Het ondertekenen van elk veld in plaats van het hele blok is een uitbreiding van deze kern, geen toevoeging aan iets dat daar nooit voor bedoeld was.

Waar we staan

Als je het tot de essentie terugbrengt, is de keuze eenvoudig. Je kunt beveiligde velden openbaar maken en de lezer vragen om op je filter te vertrouwen - dat voldoet aan de norm. Of je kunt ze openbaar maken en meteen het bewijs meeleveren - dat voldoet aan een hogere eis, die deze velden naar onze mening verdienen.

We hebben gekozen voor het bewijs, voor elke lezer, omdat een keurmerk één ding zou moeten betekenen, ongeacht wie ernaar kijkt. Voor wie wil zien hoe het werkt: de twee hierboven gelinkte demo’s controleren zichzelf direct in de browser, offline, tegen niets anders dan een openbare sleutel.

Updates over toegangsniveaus en bewijsstukken

Selectieve openbaarmaking, handtekeningen en de ontwikkeling van de DPP-normen - maandelijks in beknopte vorm in uw inbox.