← Back to all articles

Manipulationserkennung in Dokumentenarchiven: Wie Hash-Ketten funktionieren

SealDoc Team · · 7 min read

Sie können allein durch Hinsehen nicht feststellen, ob ein Dokument manipuliert wurde. Eine veränderte PDF-Datei sieht identisch mit dem Original aus. Eine ausgetauschte Datei hat denselben Dateinamen. Ein still bearbeiteter Audit-Protokolleintrag hinterlässt keine sichtbare Spur.

Manipulationserkennung erfordert einen Mechanismus, der Modifikationen zu einem erkennbaren Artefakt führt, idealerweise zu einem, das von jemandem verifiziert werden kann, der bei der ursprünglichen Erstellung nicht anwesend war. Hash-Ketten sind einer der zentralen Mechanismen, die dies leisten.

Was ein kryptografischer Hash bewirkt

Eine kryptografische Hash-Funktion nimmt eine Eingabe beliebiger Länge und erzeugt eine Ausgabe fester Länge (den Digest) mit zwei kritischen Eigenschaften:

  1. Determinismus: dieselbe Eingabe erzeugt immer dieselbe Ausgabe
  2. Lawineneffekt: jede Änderung der Eingabe, selbst ein einzelnes Bit, erzeugt eine völlig andere Ausgabe

SHA-256 erzeugt einen 256-Bit-(32-Byte-)Digest. Für jede praktische Eingabe ist es rechnerisch undurchführbar:

  • Zwei verschiedene Eingaben zu finden, die dieselbe Ausgabe erzeugen (Kollisionsresistenz)
  • Die Eingabe aus der Ausgabe zu rekonstruieren (Urbildresistenz)
  • Eine bestimmte Ausgabe zu erzeugen, ohne die Eingabe zu kennen (zweite Urbildresistenz)

Diese Eigenschaften machen einen SHA-256-Hash zu einem zuverlässigen Fingerabdruck eines Dokuments. Wenn der Hash übereinstimmt, ist das Dokument identisch mit dem, was gehasht wurde. Wenn der Hash nicht übereinstimmt, hat sich etwas verändert.

var hash = SHA256.HashData(File.ReadAllBytes("invoice.pdf"));
Console.WriteLine(Convert.ToHexString(hash));
// A3F8C2...1B7D  (64 hex chars, always the same for this file, always different if file changes)

Warum ein einzelner Hash nicht ausreicht

Das Hashen eines Dokuments liefert Ihnen zu einem Zeitpunkt einen Fingerabdruck. Aber wer speichert diesen Fingerabdruck, und was hindert jemanden daran, sowohl das Dokument als auch den gespeicherten Hash zu ersetzen?

Wenn Sie den Hash im selben System wie das Dokument speichern und Sie dieses System kontrollieren, kann ein entschlossener Angreifer (oder ein interner Akteur, der Spuren verwischt) beides ersetzen. Der Hash stimmt immer noch mit dem neuen Dokument überein. Die Manipulation ist nicht erkennbar.

Deshalb erfordert Manipulationserkennung einen externen Anker: einen Hash, der irgendwo gespeichert ist, wo der Verwahrer ihn nicht einseitig ändern kann. Ein RFC 3161-Zeitstempel ist der Standardmechanismus: Er bettet den Dokument-Hash in ein Token ein, das von einer Drittpartei-TSA signiert wurde. Der Verwahrer kann das Token nicht ohne den privaten Schlüssel der TSA ändern.

Was eine Hash-Kette hinzufügt

Eine Hash-Kette erweitert dies auf eine Ereignissequenz. Anstatt nur das Dokument zu hashen, hashen Sie jeden Audit-Eintrag und fügen den Hash des vorherigen Eintrags in den aktuellen ein.

Hash(Entry N) = SHA256( EventData(N) + Hash(Entry N-1) )

Dies erzeugt eine Kette, bei der jeder Eintrag alle vorherigen Einträge verpflichtet. Wenn Sie Eintrag 3 in einer Kette von 10 Einträgen ändern, ändert sich Hash(Eintrag 3). Da Eintrag 4 Hash(Eintrag 3) enthält, ändert sich Hash(Eintrag 4). Und so weiter bis Eintrag 10.

Sie können einen vergangenen Eintrag nicht still ändern. Die Kette wird nicht validieren.

Hier ist eine minimale Implementierung:

public sealed record AuditEntry(
    string EventType,
    string Actor,
    DateTimeOffset Timestamp,
    string DocumentHash,
    string PreviousEntryHash)
{
    public string ComputeHash()
    {
        var raw = $"{EventType}|{Actor}|{Timestamp:O}|{DocumentHash}|{PreviousEntryHash}";
        return Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(raw)));
    }
}

public static string AppendEntry(IList<AuditEntry> chain, string eventType,
    string actor, byte[] documentBytes)
{
    var previousHash = chain.Count == 0
        ? new string('0', 64)
        : chain[^1].ComputeHash();

    var docHash = Convert.ToHexString(SHA256.HashData(documentBytes));
    var entry = new AuditEntry(eventType, actor, DateTimeOffset.UtcNow, docHash, previousHash);
    chain.Add(entry);
    return entry.ComputeHash();
}

public static bool VerifyChain(IList<AuditEntry> chain)
{
    var expectedPrevious = new string('0', 64);
    foreach (var entry in chain)
    {
        if (entry.PreviousEntryHash != expectedPrevious) return false;
        expectedPrevious = entry.ComputeHash();
    }
    return true;
}

Die Verifizierung ist O(n) und erfordert keine externen Aufrufe. Jeder, der die Kette besitzt, kann VerifyChain ausführen und bestätigen, dass kein Eintrag geändert wurde.

Die Kette mit einem Zeitstempel verankern

Eine verifizierte Hash-Kette beweist interne Konsistenz: kein Eintrag wurde nach dem Aufbau der Kette geändert. Sie beweist jedoch nicht, wann die Kette aufgebaut wurde.

Wenn Sie heute eine betrügerische Kette aufbauen und behaupten, sie repräsentiere Ereignisse vor drei Jahren, verifiziert die Kette selbst korrekt. Die Hash-Kette hat keine Uhr.

Hier verankern RFC 3161-Zeitstempel die Kette in der realen Zeit. An wichtigen Punkten der Kette (mindestens: wenn die Kette abgeschlossen wird; idealerweise bei jedem bedeutenden Ereignis) fordern Sie einen Zeitstempel von einer qualifizierten TSA an. Die TSA bettet den Hash des aktuellen Eintrags in ein signiertes Token mit einem vertrauenswürdigen Zeitstempel ein.

Jetzt hat die Kette einen externen Anker. Sie können die Kette nicht über den ältesten Zeitstempel hinaus zurückdatieren, weil das Token der TSA beweist, dass der Hash zu diesem Zeitpunkt existierte, und die Uhr der TSA maßgeblich ist.

// After appending an entry, request a timestamp for the entry hash
var entryHash = AppendEntry(chain, "created", "api:tenant-1", documentBytes);
var entryHashBytes = Convert.FromHexString(entryHash);
var timestampToken = await RequestTimestampAsync(entryHashBytes, tsaUrl);

// Store the token alongside the chain entry
chain[^1] = chain[^1] with { TimestampToken = timestampToken };

Ein Prüfer, der die Kette verifiziert, kann:

  1. Verifizieren, dass die Hash-Kette intern konsistent ist (keine Änderungen)
  2. Jedes Zeitstempel-Token gegen das öffentliche Zertifikat der TSA verifizieren (keine Rückdatierung)
  3. Den Dokument-Hash in jedem Eintrag gegen das aktuelle Dokument verifizieren (kein Austausch)

Hash-Ketten im Vergleich zu anderen Integritätsmechanismen

Nur-Anhänge-Protokolle (z.B. Datenbanktabellen ohne DELETE): Verhindern Löschung über Zugriffskontrollen, sind aber nur so vertrauenswürdig wie das Zugangskontrollsystem. Ein Datenbankadministrator kann sie umgehen. Hash-Ketten sind mathematisch erzwungen, nicht durch Richtlinien.

Digitale Signaturen auf einzelnen Dokumenten: Eine Signatur beweist, dass ein Dokument zum Zeitpunkt der Signatur von einem bestimmten Schlüssel signiert wurde. Sie zeichnet nicht auf, was danach mit dem Dokument geschah. Chain of Custody erfordert die Aufzeichnung von Ereignissen nach der Signatur (Übermittlung, Konvertierung, Archivierung), nicht nur des Signaturmoments.

Blockchain: Verwendet Hash-Ketten als Kernprimitive, fügt aber verteilten Konsens hinzu, um zu verhindern, dass eine einzelne Partei die Geschichte umschreibt. Für Dokumentenarchive bietet eine lokale Hash-Kette, verankert durch externe RFC 3161-Zeitstempel, dieselbe Manipulationssicherheitsgarantie ohne die Komplexität eines verteilten Netzwerks. Der Unterschied ist wichtig: Sie brauchen keinen Konsens zwischen Fremden, um zu beweisen, dass ein Dokument nicht geändert wurde; Sie brauchen einen externen Anker, den Sie nicht kontrollieren.

WORM-Speicher (Write Once Read Many): Verhindert Änderungen auf der Speicherschicht. Das Medium kann physisch nicht überschrieben werden. Dies ergänzt Hash-Ketten, ersetzt sie aber nicht. WORM beweist, dass die gespeicherten Bits nicht verändert wurden. Eine Hash-Kette beweist, welche Ereignissequenz diese Bits produziert hat. Beide zusammen bieten stärkere Garantien als jede einzeln.

Wie Verifizierung in der Praxis aussieht

Ein vollständiger Verifizierungsworkflow für ein Dokument in einem Hash-verketteten Archiv:

  1. Dokument und Prüfpfad aus dem Archiv abrufen
  2. SHA-256 des Dokuments berechnen; bestätigen, dass er mit dem documentHash im aktuellen Ketteneintrag übereinstimmt
  3. Die Kette rückwärts durchlaufen, jeden entryHash neu berechnen und bestätigen, dass er mit dem previousEntryHash im nächsten Eintrag übereinstimmt
  4. Für jeden Eintrag mit einem Zeitstempel-Token: das Token gegen das Zertifikat der TSA verifizieren und bestätigen, dass der Hash im Token mit dem berechneten entryHash übereinstimmt
  5. Bestätigen, dass der Dokument-Hash aus Schritt 2 mit dem Dokument-Hash im frühesten Eintrag übereinstimmt, der die endgültige Form des Dokuments abdeckt

Wenn alle fünf Schritte bestanden werden, ist das Dokument als unverändert seit seiner Erstellung verifiziert, zeichnet der Prüfpfad jeden Verarbeitungsschritt korrekt auf und bieten die Zeitstempel extern verifizierbare Zeitanker.

Diese Verifizierung erfordert: das Dokument, den Prüfpfad, die Zeitstempel-Token und die öffentlichen Zertifikate der TSA. Kein Netzwerkzugriff. Keine Abhängigkeit davon, dass die Systeme des Verwahrers in Betrieb sind. Der Beweis ist eigenständig.

Manipulationserkennung als Infrastruktur

Die meisten Organisationen implementieren keine Hash-Ketten, weil sie wie ein erweitertes Feature wirken. Das sind sie nicht. SHA-256 ist in jeder modernen Laufzeitumgebung verfügbar. Der Kettenaufbau sind einige Dutzend Codezeilen. Der Vorteil ist, dass Sie die Dokumentintegrität gegenüber einer skeptischen dritten Partei nachweisen können, ohne auf das Vertrauen in Ihre Organisation angewiesen zu sein.

Für regulierte Branchen (Finanzen, Gesundheitswesen, Versicherungen, öffentlicher Sektor) ist dieser Nachweis nicht optional. Für jede Organisation, die digitale Dokumente als Beweise in einem Streitfall vorlegen möchte, ist er die Mindestanforderung.

SealDoc implementiert Hash-verkettete Prüfpfade für jedes Dokument in seiner Pipeline. Die Kette wird im Legal Evidence Pack exportiert und ist offline verifizierbar. Für Organisationen, die ihre eigene Beweisinfrastruktur aufbauen müssen, stellt die SealDoc API den Prüfpfad und die Zeitstempel-Token als strukturierte Daten bereit, die Sie in Ihre eigenen Verifizierungsworkflows integrieren können.


← Back to all articles