Merkle-Trees: DatenintegritÀt kryptografisch beweisen
Mit Merkle-Trees lĂ€sst sich auf elegante Art beweisen, dass bestimmte Daten existieren, ohne alles offenlegen zu mĂŒssen.
(Bild: Quick Shot / shutterstock.com)
- Golo Roden
Stellen Sie sich folgendes Szenario vor: Sie betreiben eine Plattform mit Millionen von Nutzerinnen und Nutzern. Eine Auditorin kommt mit einer konkreten Anfrage:
âZeigen Sie mir den Nachweis, dass Sie am 15. MĂ€rz 2024 eine DSGVO-Einwilligung fĂŒr Nutzerin #12847 erfasst haben.â
Sie wissen, dass der Datensatz existiert, er liegt in Ihrer Datenbank. Aber hier liegt das Problem: Sie können nicht einfach Ihren kompletten Datenbestand aushÀndigen. Dieser enthÀlt Millionen von EintrÀgen mit sensiblen Kundendaten, Finanztransaktionen, GeschÀftsgeheimnissen und persönlichen Informationen von Tausenden anderer Nutzerinnen und Nutzer.
Was also tun? Alles teilen geht nicht. Ein Screenshot ist nicht vertrauenswĂŒrdig, denn jeder mit grundlegenden Bildbearbeitungskenntnissen könnte den fĂ€lschen. Ein einzelner exportierter Datensatz beweist nichts, schlieĂlich könnten Sie ihn gerade eben erst erstellt haben. Was Sie benötigen, ist eine Möglichkeit, zu beweisen, dass ein bestimmter Eintrag zu einem definierten Zeitpunkt existierte, ohne etwas anderes preiszugeben.
Das ist kein hypothetisches Problem. Es ist eine reale Herausforderung bei Audits, Compliance-Anforderungen, B2B-VertrÀgen oder Rechtsstreitigkeiten. Und die Lösung liegt in der Kryptografie, genauer gesagt in einer Datenstruktur namens Merkle-Tree.
Videos by heise
Was ist ein Merkle-Tree?
Ein Merkle-Tree, benannt nach dem Informatiker Ralph Merkle, der das Konzept 1979 patentieren lieĂ, ist eine hierarchische Datenstruktur, die auf kryptografischen Hash-Funktionen basiert. Sie kennen Merkle-Trees vielleicht aus Bitcoin, wo sie Transaktionen verifizieren, oder aus Git, wo sie Ănderungen in Ihrer Codebasis nachverfolgen.
Die Grundidee ist elegant: Aus einer beliebig groĂen Datenmenge wird ein einziger Fingerabdruck berechnet, der sogenannte Merkle-Root. Dieser Fingerabdruck hat eine entscheidende Eigenschaft: Ăndert sich auch nur ein einziges Bit in den zugrundeliegenden Daten, Ă€ndert sich der Merkle-Root vollstĂ€ndig. Gleichzeitig lĂ€sst sich fĂŒr jedes einzelne Element mathematisch beweisen, dass es Teil der ursprĂŒnglichen Datenmenge war, ohne die anderen Elemente offenzulegen.
Das funktioniert, weil kryptografische Hash-Funktionen eine entscheidende Eigenschaft haben: Es ist praktisch unmöglich, Daten zu fĂ€lschen, die einen bestimmten Hash erzeugen. Ăndert sich auch nur ein einzelnes Bit in der Eingabe, ist der resultierende Hash komplett anders. Das macht Merkle-Trees perfekt fĂŒr den Nachweis von DatenintegritĂ€t und Zugehörigkeit, ohne die Daten selbst preiszugeben.
Die Bausteine: Hashes und Baumstruktur
Schauen wir uns Schritt fĂŒr Schritt an, wie das funktioniert. Und keine Sorge â Sie brauchen keine komplexe Mathematik, es geht nur um die Kernkonzepte, die Sie verstehen mĂŒssen.
Schritt 1: Jedes Element bekommt einen Hash
Jedes Datenelement in Ihrer Menge bekommt einen eindeutigen kryptografischen Hash, typischerweise mit SHA-256. Denken Sie an einen Hash wie an einen Fingerabdruck: eine Zeichenkette fester LÀnge, die das Element eindeutig reprÀsentiert. Das Ergebnis ist eine 64 Zeichen lange hexadezimale Zeichenkette.
Beispiel: Ein Datensatz könnte den Hash a3f7b2c8d4e9f1a6b5c7d8e9f0a1b2c3⊠erzeugen. Ăndern Sie auch nur ein einziges Zeichen in den Daten, erhalten Sie einen völlig anderen Hash.
Schritt 2: Paarweise kombinieren
Jetzt kommt der clevere Teil. Wir nehmen diese Element-Hashes und organisieren sie in einer binĂ€ren Baumstruktur. Nehmen Sie die ersten beiden Hashes, verketten Sie sie und hashen Sie das Ergebnis. Das ergibt einen neuen Hash, der beide Elemente reprĂ€sentiert. Machen Sie dasselbe fĂŒr das nĂ€chste Paar. Dann nehmen Sie diese kombinierten Hashes und hashen sie wieder zusammen. Fahren Sie fort, bis Sie einen einzigen Hash an der Spitze haben: den Merkle-Root.
Gehen wir ein einfaches Beispiel mit vier Elementen durch: Element 1 hat Hash H1, Element 2 hat H2, Element 3 hat H3 und Element 4 hat H4. Wir kombinieren H1 und H2, hashen das Ergebnis und erhalten H12. Wir kombinieren H3 und H4, hashen das und erhalten H34. SchlieĂlich kombinieren wir H12 und H34 und hashen sie zusammen zu H1234. Dieser finale Hash, H1234, ist Ihr Merkle-Root: ein einzelner Wert, der kryptografisch alle vier Elemente reprĂ€sentiert.
Falls Sie eine ungerade Anzahl von Elementen auf einer Ebene haben, duplizieren Sie das letzte, um Paare zu bilden. Das stellt sicher, dass Sie immer mit einem vollstÀndigen BinÀrbaum und einem einzelnen Root enden.
Merkle-Proofs: Beweisen ohne Offenlegen
Nun wird es richtig interessant. Um zu beweisen, dass Element 3 Teil der ursprĂŒnglichen Datenmenge war, mĂŒssen Sie nicht alle Elemente teilen. Sie brauchen nur drei Dinge: den Hash von Element 3 (H3), die Geschwister-Hashes entlang des Pfades von Element 3 zum Root (H4 und H12) und den Merkle-Root an sich (H1234). Das warâs. Drei Hash-Werte, und Sie können die Zugehörigkeit in einer Datenmenge von potenziell Millionen von Elementen beweisen.
Jeder kann jetzt verifizieren, dass Element 3 Teil der ursprĂŒnglichen Datenmenge war: Nehmen Sie H3 und H4 (das Geschwister auf Ebene 0), hashen Sie sie zusammen, und Sie sollten H34 erhalten. Nehmen Sie dieses Ergebnis und H12 (das Geschwister auf Ebene 1), hashen Sie sie zusammen, und Sie sollten H1234 erhalten. Vergleichen Sie dieses Ergebnis mit dem bereits bekannten Merkle-Root. Stimmt es ĂŒberein, ist der Beweis gĂŒltig.
Hier ist der entscheidende Punkt: Die verifizierende Person sieht nur drei Hashes. Sie erfĂ€hrt nichts ĂŒber Element 1, Element 2 oder Element 4. Sie kann diese Elemente nicht rekonstruieren. Sie kann nicht einmal sagen, wie viele Elemente in der Datenmenge sind. Sie weiĂ nur, dass Element 3 mit seinem spezifischen Hash Teil des Baums war, der diesen Merkle-Root erzeugt hat.
Den Merkle-Root veröffentlichen
Der Merkle-Root allein ist bereits wertvoll, aber er wird noch mĂ€chtiger, wenn Sie ihn veröffentlichen. Stellen Sie sich vor, es ist der 31. Dezember 2024. Sie wollen einen verifizierbaren Snapshot Ihres Datensatzes fĂŒr das Jahr erstellen. Sie berechnen den Merkle-Root und veröffentlichen diesen Hash: auf Ihrer Website, in Ihrem jĂ€hrlichen Transparenzbericht, in einer Blockchain-Transaktion oder in einem Certificate-Transparency-Log.
Warum? Weil Sie spĂ€ter, wenn Sie etwas ĂŒber Ihre Daten beweisen mĂŒssen, auf diesen veröffentlichten Hash verweisen können. Sie können sagen: So sah mein Datensatz am 31. Dezember 2024 aus. Jeder kann verifizieren, dass ich ihn danach nicht verĂ€ndert habe.
Jetzt ist Januar 2026. Die Auditorin fragt nach einem Beweis, dass Eintrag #12847 (die DSGVO-Einwilligung) in Ihrem Dezember-2024-Datensatz existierte. Sie generieren einen Proof, ĂŒbergeben die notwendigen Daten und die Auditorin verifiziert sie. Die Auditorin prĂŒft den veröffentlichten Merkle-Root, den Sie im Dezember 2024 gepostet haben. Stimmt er mit dem Root im Proof ĂŒberein, ist der Beweis erbracht.
Die Auditorin weiĂ dann mit kryptografischer Sicherheit, dass Eintrag #12847 in Ihrem Datensatz vom 31. Dezember 2024 existierte und dass der Eintrag seitdem nicht verĂ€ndert wurde. Aber sie hat weder den Inhalt des Eintrags erfahren (nur seinen Hash) noch irgendetwas ĂŒber andere EintrĂ€ge in Ihrem System.
Praktische AnwendungsfÀlle
Wo ist das tatsĂ€chlich nĂŒtzlich? Schauen wir uns einige konkrete Szenarien an.
Compliance und Audits: Bei DSGVO und Datenschutzvorschriften ermöglichen Merkle-Proofs den Nachweis, dass Einwilligungen, Löschanfragen oder Datenverarbeitungsprotokolle zu bestimmten Zeitpunkten erfasst wurden. Sie können Compliance demonstrieren, ohne personenbezogene Daten von Nutzerinnen und Nutzern preiszugeben. Bei SOC2- und ISO-Audits können Sie zeigen, dass Sicherheitsereignisse, Zugriffsprotokolle oder SystemÀnderungen ordnungsgemÀà aufgezeichnet wurden.
B2B-VertrĂ€ge und SLAs: Der Satz âWir garantieren, alle Transaktionen zu trackenâ wird beweisbar. Veröffentlichen Sie tĂ€gliche Merkle-Roots, die zeigen, dass Sie die komplette Transaktionshistorie pflegen, die Sie versprochen haben. Wenn eine Kundin oder ein Kunde behauptet, etwas sei passiert oder nicht passiert, liefern Sie den kryptografischen Beweis basierend auf Ihren Protokollen.
Forensik nach Datenpannen: Nach einem Sicherheitsvorfall helfen Merkle-Proofs bei der Timeline-Rekonstruktion. Sie können beweisen, welche EintrĂ€ge vor dem Vorfall existierten, was entscheidend ist fĂŒr forensische Analysen und um Regulierungsbehörden zu demonstrieren, dass Sie ordnungsgemĂ€Ăes Logging hatten. Sie können auch Nicht-Manipulation zeigen: Ein vor dem Vorfall veröffentlichter Merkle-Root beweist den Zustand Ihrer Daten zu diesem Zeitpunkt.
Supply-Chain-Transparenz: Beweisen Sie, dass ein Produkt bestimmte Schritte in Ihrer Lieferkette durchlaufen hat, ohne Lieferantenbeziehungen, Preise oder andere wettbewerbsrelevante Details preiszugeben. Teilen Sie Nachweise ĂŒber ethische Beschaffung oder Compliance-Zertifizierungen fĂŒr spezifische Produkte, ohne Ihr gesamtes Lieferkettennetzwerk offenzulegen.
Geistiges Eigentum: Merkle-Proofs liefern Zeitstempelnachweise. Beweisen Sie, dass Sie eine Information hatten oder einen Entwicklungsmeilenstein zu einem konkreten Datum abgeschlossen haben. Das ist nĂŒtzlich fĂŒr Patent-Prior-Art-Claims oder den Nachweis von InnovationszeitplĂ€nen.
Der gemeinsame Nenner in all diesen Szenarien: Sie mĂŒssen beweisen, dass Sie bestimmte Daten haben, ohne alles andere preiszugeben. Merkle-Proofs machen das möglich.
Das Snapshot-Problem und warum Event Sourcing die Lösung ist
So praktisch und vielseitig Merkle-Trees also sind, haben sie allerdings auch eine Eigenschaft, die in der Praxis schnell zum Problem wird: Jede Ănderung an den zugrundeliegenden Daten invalidiert den Merkle-Root. Das bedeutet, dass Sie fĂŒr jeden Zeitpunkt, zu dem Sie etwas beweisen wollen, den kompletten Datenbestand als Snapshot aufbewahren mĂŒssen. Bei groĂen DatensĂ€tzen wird das schnell unpraktikabel. Wollen Sie monatliche Snapshots ĂŒber mehrere Jahre? Dann speichern Sie denselben Datenbestand dutzende Male, mit minimalen Unterschieden.
Hier kommt Event Sourcing ins Spiel. Bei diesem Architekturmuster speichern Sie nicht den aktuellen Zustand, sondern die Abfolge aller Ănderungen, die zu diesem Zustand gefĂŒhrt haben. Statt âKunde X hat Adresse Yâ speichern Sie âKunde X ist am 15. MĂ€rz an folgende Adresse umgezogenâ. Der entscheidende Vorteil: Sie können den Zustand zu jedem beliebigen Zeitpunkt rekonstruieren, indem Sie die Ănderungen bis zu diesem Punkt abspielen.
FĂŒr Merkle-Trees ist das ideal. Event-Streams modifizieren niemals historische Daten, sie fĂŒgen nur neue EintrĂ€ge an. Sobald Sie einen Merkle-Root berechnet haben, wissen Sie, dass sich die EintrĂ€ge, die er reprĂ€sentiert, niemals Ă€ndern werden. Ihre Proofs bleiben unbegrenzt gĂŒltig. EintrĂ€ge in einem Event-Stream sind unverĂ€nderliche Fakten. Sie werden niemals gelöscht oder aktualisiert.
EintrĂ€ge in einem Event-Stream haben auĂerdem eine klare chronologische Ordnung. Jeder Eintrag hat eine Position im Stream. Das macht den Merkle-Tree-Aufbau deterministisch: Jeder, der einen Baum aus denselben EintrĂ€gen baut, erhĂ€lt denselben Root. Es gibt keine Mehrdeutigkeit darĂŒber, welche EintrĂ€ge wohin gehören.
Event Sourcing war schon immer gut fĂŒr Auditing. Sie konnten immer Ihre Historie durchspielen, sehen, was passierte, und verstehen, wie Sie zum aktuellen Zustand kamen. Merkle-Trees gehen jedoch einen Schritt weiter: Sie machen Ihre Historie kryptografisch beweisbar. Nicht nur âhier ist, was unsere Logs sagenâ, sondern âhier ist der mathematische Beweis, dass dieser Eintrag zu diesem Zeitpunkt existierte, und hier ist, wie Sie es selbst verifizieren könnenâ.
Implementierung in der Praxis
Das Konzept eines Merkle-Tree ist relativ einfach zu implementieren. Die Kernoperationen (Hashing, Baumaufbau, Proof-Generierung und -Verifikation) lassen sich in wenigen Hundert Zeilen Code umsetzen. SHA-256 ist in praktisch jeder Programmiersprache verfĂŒgbar, und der rekursive Aufbau des Baums ist ein klassisches Informatikproblem.
Eine konkrete Implementierung des Musters findet sich beispielsweise im npm-Paket eventsourcingdb-merkle, das wir fĂŒr die EventSourcingDB entwickelt haben. Das CLI-Tool demonstriert die typischen Operationen: Berechnung des Merkle-Roots fĂŒr einen Datensatz, Generierung von Proofs fĂŒr einzelne Elemente und Verifikation dieser Proofs ohne Zugriff auf die ursprĂŒnglichen Daten. Der Quellcode ist unter MIT-Lizenz auf GitHub verfĂŒgbar und kann als Referenz fĂŒr eigene Implementierungen dienen.
Die wesentlichen Designentscheidungen bei jeder Implementierung sind: welche Hash-Funktion verwendet wird (SHA-256 ist wie bereits erwĂ€hnt der De-facto-Standard), wie mit ungeraden Elementzahlen umgegangen wird (ĂŒblicherweise durch Duplizieren des letzten Elements), und wie die Proof-Struktur serialisiert wird (JSON ist praktisch fĂŒr InteroperabilitĂ€t). Wichtig ist auch, dass die Reihenfolge der Elemente beim Baumaufbau konsistent ist, denn sonst erhalten Sie unterschiedliche Roots fĂŒr dieselben Daten.
WeiterfĂŒhrende Möglichkeiten
Sobald Sie mit Merkle-Proofs arbeiten, eröffnen sich weitere interessante Möglichkeiten.
Kombination mit digitalen Signaturen: Wenn Sie EintrÀge zusÀtzlich mit Ed25519 oder einem anderen Signaturverfahren signieren, erhalten Sie zwei Garantien: Signaturen beweisen, dass der Eintrag von Ihrem System stammt und nicht manipuliert wurde. Merkle-Proofs beweisen, dass der Eintrag zum fraglichen Zeitpunkt Teil Ihres Datensatzes war. Zusammen bieten sie End-to-End kryptografische IntegritÀt: AuthentizitÀt plus Zugehörigkeit.
Veröffentlichung auf öffentlichen Ledgern: Die Veröffentlichung auf Ihrer Website ist ein guter Anfang, aber Sie könnten den Root auch nachtrĂ€glich Ă€ndern. FĂŒr maximale Beweiskraft veröffentlichen Sie Ihre Merkle-Roots auf einem öffentlichen Ledger: Eine Blockchain-Transaktion oder ein Certificate-Transparency-Log schafft einen Zeitstempel, den Sie nicht manipulieren können. Das ist aufwendiger, aber in regulierten Branchen oder bei hohen Streitwerten kann sich der Mehraufwand lohnen.
Selective Disclosure Workflows: Merkle-Proofs ermöglichen auch anspruchsvolle Szenarien mit selektiver Offenlegung. Stellen Sie sich vor: Sie sammeln Daten aus mehreren Quellen, und verschiedene Parteien dĂŒrfen unterschiedliche Teilmengen sehen. Mit Merkle-Trees geben Sie jeder Partei nur die Proofs fĂŒr die EintrĂ€ge, die sie sehen darf. Die Partei kann verifizieren, dass diese EintrĂ€ge Teil des Gesamtdatensatzes sind, erfĂ€hrt aber nichts ĂŒber die restlichen Daten. Das ist besonders relevant fĂŒr Multi-Mandanten-Systeme oder DatenmarktplĂ€tze.
Fazit
Merkle-Trees lösen ein konkretes Problem: Sie ermöglichen den Nachweis, dass bestimmte Daten zu einem gegebenen Zeitpunkt existierten, ohne den gesamten Datenbestand offenzulegen. Die Mathematik dahinter ist seit Jahrzehnten erprobt und bildet das Fundament von Systemen wie Git und Bitcoin.
FĂŒr Entwicklerinnen und Entwickler, die mit Audits, Compliance oder DatenintegritĂ€t zu tun haben, lohnt sich ein Blick auf diese Datenstruktur. Die Implementierung ist ĂŒberschaubar, die Vorteile sind handfest: Sie können Behauptungen ĂŒber Ihre Daten nicht nur aufstellen, sondern kryptografisch belegen. Und Ihre GegenĂŒber können diese Belege unabhĂ€ngig verifizieren, ohne Ihnen vertrauen zu mĂŒssen.
(mai)