Offenlegen, ohne die Signatur zu verlieren

Offenlegen, ohne die Signatur zu verlieren

Jeder Leser eines Produktpasses bekommt dieselben öffentlichen Daten, manche bekommen geschützte Felder dazu. Die leisere Frage ist, ob diese zusätzlichen Felder ihren Beweis mitbringen. Wir signieren jedes Feld einzeln, damit auch ein offengelegtes Feld gegen einen öffentlichen Schlüssel verifiziert - offline, ohne Rückfrage bei uns.

Ein Digitaler Produktpass zeigt nicht allen dasselbe. Eine Käuferin sieht die öffentlichen Daten. Ein Reparaturbetrieb oder ein Aufbereiter sieht mehr. Eine Marktüberwachungsbehörde sieht alles. Das ist geklärt, und die europäischen Normen schreiben es inzwischen ausdrücklich fest.

Die interessante Frage ist leiser: Wenn jemandem über die öffentlichen Daten hinaus geschützte Felder offengelegt werden, kann er dann belegen, dass ausgerechnet diese Felder echt sind? Oder muss er darauf vertrauen, dass die Plattform sie korrekt herausgesucht und unverändert weitergereicht hat?

Bei den meisten Plattformen lautet die ehrliche Antwort: Vertrauen. Wir haben unsere so gebaut, dass die Antwort Beweis lautet - nicht nur für die öffentlichen Felder, sondern für jedes Feld, das erst bei der Offenlegung dazukommt. Warum dieser Unterschied zählt, und warum wir dafür den aufwendigeren Weg gegangen sind.

Die Zugriffsregel erfüllen alle gleich

EN 18239, die europäische Norm für Zugriffsrechte, Sicherheit und Vertraulichkeit im DPP, verlangt Zugriffssteuerung je Datenelement: Für jedes Feld gibt es eine Regel, wer es sehen darf. Das ist die richtige Anforderung, und sie ist nicht schwer zu erfüllen. Welchen Status diese Normen überhaupt haben, haben wir unter harmonisierte Normen aufgeschlüsselt.

Der übliche Weg dorthin ist serverseitiges Filtern. Der Server weiss, wer fragt, schlägt nach, was diese Person sehen darf, und liefert genau diesen Ausschnitt zurück. Zugriffssteuerung: erledigt. Mehr verlangt die Norm nicht.

Einen Haken hat das, um den sich die Norm nicht kümmert: Der Ausschnitt kommt unsigniert an. Der Leser erhält eine für ihn zusammengestellte Ansicht und muss glauben, dass der Server ehrlich ausgewählt und unterwegs nichts verändert hat. Für ein öffentliches Merkblatt ist das in Ordnung. Für einen Wert, auf den ein Aufbereiter gleich den Preis einer gebrauchten Batterie stützt, ist es viel Glaube.

Wo eine einzelne Signatur an ihre Grenze kommt

Die naheliegende Lösung ist, die Daten zu signieren. Für die beiden Enden der Skala funktioniert eine gewöhnliche Signatur gut: die öffentliche Ansicht signieren, den vollständigen Datensatz signieren, und beide prüfen sich gegen einen öffentlichen Schlüssel, ohne dass ein Server dazwischensteht. Wie das im Detail abläuft, steht in Signaturen und Zertifikate im DPP.

In der Mitte bricht es. Eine Signatur über das ganze Dokument deckt genau einen Satz Felder ab, nämlich die, die beim Signieren vorhanden waren. Legt man einem berechtigten Leser ein geschütztes Feld zusätzlich offen, liegt dieses Feld ausserhalb der signierten Menge und kommt ungedeckt bei ihm an. Signiert man stattdessen von vornherein den vollen Datensatz, deckt die Signatur zwar alles ab, aber dann müsste man auch jedem alles zeigen.

Die Stufen dazwischen fallen damit durch das Raster: der Reparaturbetrieb, der Versicherer, der Recycler. Wollte man jede mögliche Kombination von Wer-sieht-was im Voraus signieren, bräuchte man pro Kombination ein eigenes signiertes Dokument, und die Zahl der Kombinationen explodiert mit jeder weiteren Zugriffsgruppe. Das macht niemand. Man fällt zurück auf den unsignierten Serverfilter, und die mittlere Stufe läuft wieder auf Vertrauen.

Jedes Feld einzeln signieren

Es gibt eine bessere Konstruktion, und auf ihr bauen wir die Plattform auf. Statt das fertige Dokument als einen Block zu signieren, legt sich der Aussteller in einem einzigen Signaturdurchgang auf jedes Feld einzeln fest (für die Normenkundigen: der W3C-Nachweis ecdsa-sd-2023 für selektive Offenlegung).

Jede Ansicht beginnt beim öffentlichen Kern

Jede Ansicht beginnt damit bei denselben öffentlichen Feldern. Was ein Leser darüber hinaus zu sehen bekommt, kommt Feld für Feld hinzu, und jedes dieser Felder führt weiterhin auf den öffentlichen Schlüssel des Ausstellers zurück - offline, ohne erneutes Signieren und ohne Vertrauen in die Stelle, die die Ansicht zusammengestellt hat. Die Felder ohne Anspruch fehlen schlicht. Nicht geschwärzt, sondern gar nicht da, und es sickert nichts über sie durch.

Warum «ungebrochen» der ganze Punkt ist

Man stelle sich einen Notar vor, der nicht den Brief als Ganzes beglaubigt, sondern jeden Absatz einzeln. Den öffentlichen Brief bekommt jeder. Wer Anspruch auf mehr hat, bekommt die zusätzlichen Absätze dazu, und jeder davon trägt weiterhin das Siegel desselben Notars. Beim üblichen Vorgehen tippt die Plattform diese Absätze für Sie ab, und was bei Ihnen ankommt, trägt nur noch ihr Wort.

Warum es dabei auf «ungebrochen» ankommt, lohnt einen Satz mehr. Ein intaktes Siegel sagt nicht, dass der Inhalt wahr ist. Es sagt: Genau das hat der Aussteller geschrieben, und seither hat niemand ein Zeichen daran verändert. Damit fällt jeder aus der Vertrauensfrage heraus, der das Dokument nur weitergereicht hat - der Zwischenspeicher, das Netz, das Archiv, wir. Wer Ihnen den Pass gegeben hat, spielt keine Rolle mehr.

Und ein Siegel ist binär. Es hält oder es hält nicht, ein halb gebrochenes gibt es nicht. Bricht es, erfahren Sie nicht, welcher Satz verändert wurde, sondern nur, dass Sie dem ganzen Blatt nicht mehr trauen können. Deshalb ist es kein gradueller Unterschied, ob die zusätzlichen Felder mit ihrem Siegel bei Ihnen ankommen oder ohne: Ohne Siegel sind sie nicht etwas schwächer belegt, sie sind gar nicht belegt.

Beide Verfahren zum Anschauen

Prüfen kann das jeder selbst. Die Transpareo Time Machine ist unsere quelloffene Anzeige-App für Produktpässe: Sie blättert durch die Versionsgeschichte eines Passes und rechnet dabei jede Signatur im Browser des Betrachters nach, ohne einen Server von uns zu fragen. Zwei Beispielpässe laufen darin öffentlich. Der Pass eines T-Shirts trägt eine Signatur über das ganze Dokument, der Pass einer Batterie die feldweise Offenlegung.

Beides sind offene W3C-Spezifikationen: eddsa-jcs-2022 für die Signatur über das ganze Dokument, ecdsa-sd-2023 für die feldweise Offenlegung. Umsetzen kann sie jeder, der will. Der Aufwand ist der Grund, warum viele es nicht tun werden: Die Signatur über das ganze Dokument ist deutlich billiger zu bauen und zu betreiben, und wer nur öffentliche Daten ausliefert, kommt damit aus.

Dass die Time Machine beide Verfahren beherrscht, ist Absicht und bleibt so. Sie gehört keiner Plattform. Ein Prüfer, der nur das teurere Verfahren akzeptiert, wäre ein Werkzeug für uns und für sonst niemanden.

Wem die geschützten Felder offengelegt werden

Es lohnt sich zu fragen, wem über die öffentlichen Daten hinaus überhaupt etwas offengelegt wird. Nicht der beiläufigen Käuferin, die bekommt den öffentlichen Pass. Es sind der Aufbereiter, der beurteilt, was ein gebrauchtes Batteriepaket wert ist, der Versicherer, der ein Risiko bepreist, der Recycler, der Chemien sortiert, die Behörde, die einen Fall aufbaut. Das sind die Leser, deren Entscheidungen an Geld oder Sicherheit hängen.

Und es sind genau die Felder, die im üblichen Ansatz ungedeckt ankommen. Wer am meisten Grund hätte, einen kryptografischen Nachweis zu wollen, bekommt ihn ausgerechnet für die Felder nicht, die seine Entscheidung tragen.

Wir finden, ein Prüfsiegel sollte für alle dasselbe bedeuten. «Von Transpareo geprüft» steht auf der erweiterten Ansicht eines Reparaturbetriebs für dasselbe wie auf dem öffentlichen Pass einer Käuferin: Jedes gezeigte Feld stammt vom Aussteller und wurde seither nicht angefasst. Ein Siegel, das nur für die öffentlichen Felder trägt, ist ein halbes Siegel.

Mehr, als die Norm verlangt

Wir sagen es offen: Vorgeschrieben ist nichts davon. EN 18239 verlangt, dass der Zugriff gesteuert wird, und ein serverseitiger Filter steuert Zugriff einwandfrei. Auch die offengelegten Felder kryptografisch prüfbar zu machen, ist etwas, das wir obendrauf tun, kein Häkchen, das die Regulierung von uns verlangt.

Genau deshalb ist es wert, aufgeschrieben zu werden. Es wäre leicht, den Buchstaben der Norm zu erfüllen, den Serverfilter auszuliefern und die Stufe für erledigt zu erklären. Uns ist lieber, die Zusage gilt überall dort, wo das Siegel auftaucht. Denn der ganze Sinn eines signierten Passes ist, dass niemand der Plattform vertrauen muss. Die mittlere Stufe als Ausnahme herauszuschneiden, holt genau das Vertrauen zurück, das die Signatur beseitigen sollte.

Dasselbe Prinzip lässt ein Feld vergessen werden

Sich auf jedes Feld einzeln festzulegen, bringt eine zweite Eigenschaft mit, und diese verlangt europäisches Recht tatsächlich. Die Datenschutz-Grundverordnung gibt Menschen das Recht, personenbezogene Daten löschen zu lassen. Ein als ein Block signierter Datensatz kann dem nicht nachkommen, ohne die eigene Signatur zu zerstören.

Weil hier jedes Feld für sich steht, lässt sich ein einzelnes Feld entfernen, während alles Übrige weiterhin verifiziert. Landen versehentlich personenbezogene Daten in einem Pass, kommen sie sauber wieder heraus, und der Pass bleibt gültig: kein Neuausstellen, keine zerrissene Historie. Die regulatorischen Felder, die das Gesetz aufzubewahren verlangt, bleiben liegen; was löschbar ist, lässt sich auf Verlangen löschen, auch noch Jahre später.

Trotzdem ein ganz gewöhnlicher Pass

Nichts davon macht aus dem Pass ein Sonderobjekt, das nur unsere Werkzeuge öffnen. Er bleibt ein Verifiable Credential in JSON-LD, dem Format, auf das die Welt der Webstandards zuläuft, und dieselbe Form, die das UN Transparency Protocol und das übrige W3C-Umfeld verwenden.

Der Pass, den eine Käuferin im Browser scannt, ist damit dasselbe Objekt, das ein Datenraum-Partner einlesen kann, und jeder normkonforme Prüfer kann ihn prüfen, nicht nur unserer. Die zusätzliche Sicherheit kostet den Leser nichts und bindet niemanden an uns.

Warum das technisch schwer ist

Vorweg, damit kein falscher Eindruck entsteht: Erfunden haben wir das Verfahren nicht. ecdsa-sd-2023 ist eine öffentliche W3C-Spezifikation, die Kryptografie dahinter stammt nicht von uns, und wer sie umsetzen möchte, kann das nachlesen. Schwer ist nicht, die Idee zu haben. Schwer ist, sie so zu bauen, dass ein Pass in zehn Jahren noch prüft. Dort sitzt die Arbeit, und darüber lässt sich etwas Nützliches sagen.

Der Unterschied klingt klein, verschiebt aber die Grundlage: Eine gewöhnliche Signatur rechnet über die Bytes eines Dokuments. Selektive Offenlegung rechnet über seine Aussagen. Der Pass wird vor dem Signieren in eine normierte Form gebracht, in der jede Angabe als eigener, für sich stehender Satz vorliegt. Erst dadurch lässt sich ein Satz weglassen, ohne die übrigen zu beschädigen.

Damit erbt man ein Problem, das eine Byte-Signatur nicht hat: Dieselbe normierte Form muss in zehn Jahren wieder exakt herauskommen. Nicht ungefähr, sondern Zeichen für Zeichen, sonst passt kein Nachweis mehr. Drei Dinge stehen dem im Weg, und alle drei sind unscheinbar.

Zahlen verlieren ihren Typ. Schreibt man eine Zahl als blosses JSON, geht unterwegs verloren, was für eine Zahl es war. Ein Wert wie 2.0 kommt nach einer Runde durch JSON als 2 zurück. Für einen Menschen dasselbe, für die normierte Form ein anderer Satz, und die Prüfung scheitert.

Bezeichnungen sind noch keine Bedeutung. Damit die normierte Form entsteht, muss jeder Feldname auf eine eindeutige Bedeutung auflösen. Fehlt eine, verschwindet das Feld bei der Umwandlung stillschweigend. Es steht dann im Pass, aber der Nachweis deckt es nicht ab, und niemand merkt es.

Bedeutungen liegen üblicherweise im Netz. Diese Zuordnung steht in einem Vokabular, das die meisten Werkzeuge beim Prüfen über das Netz nachladen. Wer das tut, macht die Prüfbarkeit seines Passes davon abhängig, dass eine fremde Adresse in zehn Jahren noch antwortet, und zwar unverändert.

Wie wir es gelöst haben

Wir haben die drei Punkte an der Wurzel geschlossen, statt sie später abzufangen.

Typen. Jeder Wert wird mit seinem Typ geschrieben, und die Veröffentlichung bricht ab, sobald in der normierten Form auch nur eine typlose Zahl auftaucht. Der Fehler landet damit dort, wo er eine Zeile kostet, statt Jahre später als unerklärliche Prüfverletzung.

Vokabulare. Jedes Vokabular, auf das ein Pass verweist, liegt bei uns lokal vor und wird nie über das Netz geholt. Eine unbekannte Adresse ist ein harter Abbruch beim Signieren, kein stiller Rückfall auf ein leeres Ergebnis.

Kennungen. Jeder Knoten im Dokument trägt eine stabile Kennung, damit die normierte Form reproduzierbar bleibt, statt bei jedem Durchlauf neue Hilfsnamen zu vergeben.

Der heikelste Teil steckt in Bring Your Own Key. Für jede Ausstellung wird ein zusätzlicher, kurzlebiger Schlüssel gebraucht, mit dem die offenlegbaren Felder einzeln unterschrieben werden. Diesen Schlüssel erzeugt und verwirft der Aussteller selbst. Läge er bei uns, könnten wir einzelne Felder nachträglich erfinden, und die Unabhängigkeit der Ausstellersignatur wäre nur noch behauptet. Den zurückkommenden Nachweis prüfen wir gegen den hinterlegten öffentlichen Schlüssel, bevor wir ihm trauen.

Zwei solche Nachweise trägt jeder Pass, einen des Ausstellers und einen von Transpareo, und jeder von beiden wird für die Ansicht eines Lesers unabhängig abgeleitet. Zwei Signaturen, zwei voneinander unabhängige Autoritäten, auch für ein einzeln offengelegtes Feld.

Für uns liegt dieser Aufwand an der richtigen Stelle. Wir haben die Prüfbarkeit nicht nachträglich angebaut; die Plattform ist von der ersten Version an darum herum entstanden. Jeder Pass wird beim Veröffentlichen signiert und an die Version davor gekettet. Das unveränderbare Zehn-Jahres-Archiv ist angelegt und greift, sobald die Pässe beim EU-DPP-Register registriert sind. Jedes Feld statt des ganzen Blocks zu signieren, ist eine Erweiterung dieses Kerns, kein Aufsatz auf etwas, das nie dafür gedacht war.

Wo wir stehen

Reduziert man es, ist die Wahl einfach. Sie können geschützte Felder offenlegen und den Leser bitten, Ihrem Filter zu vertrauen - das erfüllt die Norm. Oder Sie können sie offenlegen und den Beweis gleich mitgeben - das erfüllt einen höheren Anspruch, den diese Felder unserer Meinung nach verdienen.

Wir haben uns für den Beweis entschieden, für jeden Leser, weil ein Siegel eine Sache bedeuten sollte, gleich wer hinsieht. Wer es arbeiten sehen will: Die beiden weiter oben verlinkten Demos prüfen sich direkt im Browser, offline, gegen nichts als einen öffentlichen Schlüssel.

Updates zu Zugriffsstufen und Nachweisen

Selektive Offenlegung, Signaturen und die Entwicklung der DPP-Normen - monatlich kompakt in Ihrem Posteingang.