Ausführliche technische Dokumentation der kryptografischen Architektur, des Sicherheitsmodells und des Datenschutz-Engineerings von PDF Pro. Verfasst für sicherheitsbewusste Nutzer, Prüfer und Gutachter.
Ende-zu-Ende-verschlüsselter Dateitransfer
PDF Pro Whitepaper WP-001 — Architektur und Sicherheitsanalyse
Dieses Whitepaper beschreibt die Architektur des Secure-Transfer-Systems von PDF Pro, eines Zero-Knowledge-Mechanismus zur Dateiübertragung, bei dem Dateien vor dem Upload clientseitig mit AES-256-GCM verschlüsselt werden. Der Server speichert ausschließlich opakes Chiffrat und ist zu keinem Zeitpunkt in der Lage, Dateiinhalte zu entschlüsseln, einzusehen oder zu lesen. Das System unterstützt zwei Schlüsselmodi: einen automatisch erzeugten Zufallsschlüssel (der über das URL-Fragment übertragen wird, welches niemals an den Server gesendet wird) oder einen aus einer Passphrase abgeleiteten Schlüssel mittels PBKDF2. In beiden Modi existiert der Verschlüsselungsschlüssel ausschließlich in den Browsern von Absender und Empfänger. Dieses Dokument beschreibt die kryptografischen Primitiven, den Datenfluss, das Bedrohungsmodell sowie die ehrlich dargelegten Einschränkungen des Systems.
Das Secure-Transfer-System folgt einer strikten Trennung zwischen Client und Server, bei der alle kryptografischen Operationen ausschließlich im Browser stattfinden:
Der Server ist bewusst als „dumme Leitung" für verschlüsselte Daten konzipiert. Er hat keine Kenntnis vom Verschlüsselungsschlüssel, der Passphrase oder den Dateiinhalten. Dies wird architektonisch durchgesetzt und nicht bloß durch Richtlinien.
Designprinzip: Der Server sollte kompromittierbar sein, ohne dass dadurch Nutzerdaten kompromittiert werden. Selbst bei vollständigem Datenbankzugriff und serverseitiger Codeausführung kann ein Angreifer übertragene Dateien nicht entschlüsseln.
Die gesamte Dateiverschlüsselung verwendet den authentifizierten Verschlüsselungsalgorithmus AES-256-GCM, der über die native Web Crypto API des Browsers angesprochen wird. Dies gewährleistet sowohl Vertraulichkeit (Daten können nicht gelesen werden) als auch Integrität (Daten können nicht unbemerkt verändert werden).
| Parameter | Wert | Begründung |
|---|---|---|
| Algorithmus | AES-256-GCM | NIST-zugelassene, authentifizierte Verschlüsselung mit assoziierten Daten (AEAD) |
| Schlüssellänge | 256 Bit | Maximale AES-Schlüssellänge; bietet 128-Bit-Sicherheit gegen Brute-Force-Angriffe |
| IV-Länge | 96 Bit (12 Byte) | Von NIST empfohlene IV-Länge für den GCM-Modus |
| Tag-Länge | 128 Bit (16 Byte) | Vollständiger Authentifizierungs-Tag für maximalen Integritätsschutz |
| IV-Erzeugung | crypto.getRandomValues() | Kryptografisch sicherer Zufallszahlengenerator |
// Vereinfachter Verschlüsselungsablauf (Web Crypto API) const iv = crypto.getRandomValues(new Uint8Array(12)); const salt = crypto.getRandomValues(new Uint8Array(16)); // Schlüssel aus Passphrase ableiten (siehe Abschnitt 1.4) const key = await deriveKey(passphrase, salt); // Datei verschlüsseln const ciphertext = await crypto.subtle.encrypt( { name: "AES-GCM", iv: iv }, key, fileArrayBuffer ); // Paketstruktur: [salt (16B)] + [iv (12B)] + [ciphertext + tag] const blob = concatenate(salt, iv, ciphertext);
Der finale verschlüsselte Blob ist eine Verkettung dreier Komponenten: des 16 Byte langen Salt (für die Schlüsselableitung verwendet), des 12 Byte langen IV (für AES-GCM verwendet) und des Chiffrats mit angehängtem 16 Byte langen GCM-Authentifizierungs-Tag. Dieser Blob ist das, was der Server empfängt und speichert.
Secure Transfer unterstützt zwei sich gegenseitig ausschließende Schlüsselmodi. Der Modus wird vom Absender beim Erstellen der Übertragung gewählt.
Im Standardmodus ist keine Passphrase beteiligt. Der Browser erzeugt direkt einen kryptografisch zufälligen 256-Bit-AES-Schlüssel:
crypto.getRandomValues() und crypto.subtle.generateKey().#) platziert.Wenn der Absender eine Passphrase festlegt, wird der Schlüssel mittels PBKDF2 aus dieser Passphrase abgeleitet:
| Parameter | Wert | Begründung |
|---|---|---|
| Algorithmus | PBKDF2 | Gemäß NIST SP 800-132 empfohlen; umfassend geprüft |
| Hashfunktion | SHA-256 | Kryptografische Standard-Hashfunktion; 256-Bit-Ausgabe |
| Iterationen | 600.000 | Erfüllt die OWASP-Empfehlung 2023 für PBKDF2-SHA256 |
| Salt-Länge | 128 Bit (16 Byte) | Eindeutig je Übertragung; verhindert Rainbow-Table-Angriffe |
| Ausgabe-Schlüssellänge | 256 Bit | Entspricht der Anforderung von AES-256 |
async function deriveKey(passphrase, salt) { // Passphrase als rohes Schlüsselmaterial importieren const keyMaterial = await crypto.subtle.importKey( "raw", new TextEncoder().encode(passphrase), { name: "PBKDF2" }, false, ["deriveKey"] ); // AES-256-GCM-Schlüssel ableiten return crypto.subtle.deriveKey( { name: "PBKDF2", salt: salt, iterations: 600000, hash: "SHA-256" }, keyMaterial, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"] ); }
Sicherheitshinweis: Die Sicherheit hängt in Modus B von der Entropie der Passphrase ab. Wir empfehlen Passphrasen mit mindestens 12 Zeichen, die Groß- und Kleinbuchstaben, Ziffern sowie Symbole kombinieren.
Der vollständige Lebenszyklus einer sicheren Übertragung verläuft wie folgt:
crypto.getRandomValues().#) an.crypto.getRandomValues().| Datenelement | Serverzugriff? | Details |
|---|---|---|
| Verschlüsselter Blob (Salt + IV + Chiffrat + Tag) | Ja | Opake Binärdaten; der Server kann die Inhalte nicht interpretieren |
| Übertragungs-ID | Ja | Übertragungs-IDs sind UUID-v4-Werte, erzeugt durch PostgreSQLs gen_random_uuid(), und liefern 122 Bit kryptografische Zufälligkeit aus dem serverseitigen CSPRNG |
| Ursprünglicher Dateiname | Ja | In den Metadaten gespeichert zur Anzeige beim Empfänger |
| Ursprüngliche Dateigröße | Ja | In den Metadaten zu Anzeigezwecken gespeichert |
| Ablaufzeitstempel | Ja | Wird zur Durchsetzung der automatischen Löschung verwendet |
| Downloadanzahl / Limit | Ja | Wird zur Durchsetzung von „Burn on read" und Downloadlimits verwendet |
| Absender-Nutzer-ID (bei Authentifizierung) | Ja | Verknüpft die Übertragung zu Verwaltungszwecken mit dem Konto |
| Passphrase | Nein — niemals | Wird niemals an den Server gesendet; verlässt niemals den Browser |
| Abgeleiteter Verschlüsselungsschlüssel | Nein — niemals | Existiert nur während der Ver-/Entschlüsselung im Browserspeicher |
| Klartext-Dateiinhalte | Nein — niemals | Nur verschlüsseltes Chiffrat erreicht den Server |
| PBKDF2-Iterationsanzahl | Nein | Im Client fest kodiert; wird nicht an den Server übermittelt |
Alle sicheren Übertragungen sind ihrer Gestaltung nach flüchtig. Es gibt keine Option zur dauerhaften Speicherung.
| Option | Verhalten | Durchsetzung |
|---|---|---|
| Burn on read | Der verschlüsselte Blob wird unmittelbar nach dem ersten erfolgreichen Download gelöscht | Serverseitig: Blob wird nach Abschluss des Download-Streams aus dem Speicher gelöscht |
| 1 Stunde | Automatische Löschung nach 1 Stunde unabhängig vom Downloadstatus | Serverseitig: geplanter Aufräumjob + Ablaufprüfung beim Zugriff |
| 24 Stunden | Automatische Löschung nach 24 Stunden | Wie oben |
| 7 Tage | Maximale Aufbewahrung; automatische Löschung nach 7 Tagen | Wie oben |
Wenn eine Übertragung abläuft oder beim Lesen vernichtet wird, wird der verschlüsselte Blob dauerhaft aus Supabase Storage gelöscht. Der Metadatensatz wird 30 Tage lang in einem weich-gelöschten Zustand aufbewahrt (zur Missbrauchsuntersuchung), bevor er endgültig entfernt wird. Der Metadatensatz enthält weder den Verschlüsselungsschlüssel, noch die Passphrase, noch irgendeine Information, mit der die Datei rekonstruiert werden könnte.
| Bedrohung | Angriffsvektor | Gegenmaßnahme |
|---|---|---|
| Serverkompromittierung | Der Angreifer erlangt vollständigen Zugriff auf Datenbank und Speicher | Alle gespeicherten Daten sind AES-256-GCM-Chiffrat. Der Angreifer erhält lediglich opake Blobs. Ohne Passphrase ist ein Brute-Force gegen 256-Bit-AES rechnerisch undurchführbar. |
| Netzwerk-Abhörung (MITM) | Der Angreifer fängt Daten während der Übertragung ab | Der gesamte Verkehr nutzt TLS 1.3. Selbst wenn TLS gebrochen wäre, erhielte der Angreifer nur verschlüsselte Blobs (analog zur Serverkompromittierung). |
| Schwache Passphrase | Der Angreifer knackt eine kurze oder häufige Passphrase per Brute-Force | PBKDF2 mit 600.000 Iterationen verteuert jeden Versuch erheblich. Selbst eine vierstellige Passphrase erfordert nennenswerte Rechenleistung. Die Benutzeroberfläche erzwingt eine Mindestlänge und gibt Rückmeldung zur Passphrasenstärke. |
| Abfangen der Passphrase | Der Angreifer fängt die zwischen Absender und Empfänger geteilte Passphrase ab | Die Passphrase wird außerhalb unseres Systems geteilt. Wir empfehlen, sie über einen anderen Kanal als die Übertragungs-URL auszutauschen. Dies liegt in der Verantwortung des Nutzers. |
| Manipulation des clientseitigen Codes | Der Angreifer verändert das an den Nutzer ausgelieferte JavaScript | Alle Assets werden über HTTPS und das CDN von Vercel ausgeliefert. Subresource Integrity (SRI)-Hashes schützen vor Manipulationen auf CDN-Ebene. Nutzer können den Quellcode in den DevTools des Browsers überprüfen. |
| Speicherauslese | Der Angreifer extrahiert den Verschlüsselungsschlüssel aus dem Browserspeicher | Schlüssel der Web Crypto API werden, wo möglich, als nicht extrahierbar markiert. Abgeleitete Schlüssel existieren nur während der Ver-/Entschlüsselung im Speicher. Die Speicher-Isolation des Browsers bietet Schutz auf Betriebssystemebene. |
| Replay-Angriff | Der Angreifer spielt einen abgefangenen verschlüsselten Blob erneut ab | Jede Übertragung besitzt eine eindeutige ID und ist durch Downloadlimits sowie Ablaufzeiten geschützt. Burn-on-Read-Übertragungen werden nach dem ersten Zugriff gelöscht. |
Ehrliche Einschränkungen: Kein Sicherheitssystem ist perfekt. Wir stehen für die transparente Offenlegung bekannter Einschränkungen.
Datenschutzorientierte kryptografische Dokumentensignatur
PDF Pro Whitepaper WP-002 — Architektur und Sicherheitsanalyse
Dieses Whitepaper beschreibt die Architektur des Privacy-Signature-Systems von PDF Pro, eines kryptografischen Mechanismus zur Dokumentensignatur, bei dem das PDF-Dokument den Browser des Unterzeichners niemals verlässt. Das System verwendet ECDSA mit der Kurve P-256 und SHA-256-Hashing zur Erzeugung abgetrennter digitaler Signaturen. Nur der Dokumenten-Hash, die kryptografische Signatur und der öffentliche Schlüssel werden an den Server übermittelt. Private Schlüssel werden ausschließlich im Browser des Nutzers erzeugt, verschlüsselt und in IndexedDB gespeichert, geschützt durch PBKDF2-Schlüsselableitung (600.000 Iterationen) und AES-256-GCM-Verschlüsselung. Dieses Dokument beschreibt die vollständige Signier- und Verifizierungsarchitektur, das Schlüsselverwaltungsmodell, das Schema des signierten Payloads, die Gestaltung des Audit-Trails, das Bedrohungsmodell sowie die ehrlich dargelegten Einschränkungen.
Das Privacy-Signature-System ist auf eine fundamentale Einschränkung hin konzipiert: Das PDF-Dokument darf niemals an den Server übermittelt werden. Dies wird architektonisch durch ein Modell abgetrennter Signaturen durchgesetzt.
Kerngarantie: Der Server sieht, empfängt oder verarbeitet das PDF-Dokument niemals. Die einzigen dokumentenbezogenen Daten, die der Server jemals erhält, sind ein SHA-256-Hash — ein fester 256-Bit-Wert, aus dem das Originaldokument nicht rekonstruiert werden kann.
| Parameter | Wert | Begründung |
|---|---|---|
| Signaturalgorithmus | ECDSA (Elliptic Curve Digital Signature Algorithm) | NIST FIPS 186-4; kompakte Signaturen; hohe Sicherheit pro Schlüsselbit |
| Kurve | P-256 (secp256r1 / prime256v1) | NIST-zugelassen; 128-Bit-Sicherheitsniveau; breite Unterstützung in der Web Crypto API |
| Hashfunktion | SHA-256 | NIST FIPS 180-4; 256-Bit-Digest; kollisionsresistent |
| Schlüssellänge | 256-Bit-Privatschlüssel, 512-Bit-Öffentlicher Schlüssel (unkomprimiert) | Standard für P-256; äquivalent zu ~3072-Bit-RSA |
| Signaturgröße | 64 Byte (r: 32 Byte, s: 32 Byte) | Kompakt; geeignet für Speicherung und Übertragung |
| Signaturformat | IEEE P1363 (roh r || s) | Native Ausgabe der Web Crypto API; base64url-kodiert zur Speicherung |
Signaturkodierung: ECDSA mit P-256 in der Web Crypto API erzeugt eine rohe 64-Byte-Signatur, bestehend aus zwei 32-Byte-Ganzzahlen (r || s) im Big-Endian-Festbreitenformat. Diese Rohausgabe wird zur Speicherung base64url-kodiert. Sie ist NICHT DER-kodiert — es handelt sich um das IEEE P1363-Format, das die Web Crypto API nativ produziert.
// 1. PDF-Dokument hashen (clientseitig) const fileBuffer = await file.arrayBuffer(); const hashBuffer = await crypto.subtle.digest("SHA-256", fileBuffer); const hashHex = Array.from(new Uint8Array(hashBuffer)) .map(b => b.toString(16).padStart(2, '0')).join(''); // 2. Hash mit privatem Schlüssel signieren (clientseitig) const signature = await crypto.subtle.sign( { name: "ECDSA", hash: "SHA-256" }, privateKey, // CryptoKey aus IndexedDB (entschlüsselt) hashBuffer ); // 3. An den Server senden: Hash + Signatur + öffentlicher Schlüssel (NICHT das PDF) await submitSignature({ documentHash: hashHex, signature: base64Encode(signature), publicKey: exportedPublicKeyJWK });
| Schlüsseltyp | Kontext | Lebenszyklus | Speicherung |
|---|---|---|---|
| Flüchtig | Gastnutzer (nicht angemeldet) | Je Sitzung erzeugt; beim Schließen des Tabs vernichtet | Nur im Speicher (CryptoKey-Objekt); niemals persistiert |
| Persistent | Authentifizierte Nutzer (angemeldet) | Einmal erzeugt; sitzungsübergreifend persistiert; widerrufbar | IndexedDB (verschlüsselt mit PBKDF2 + AES-256-GCM) |
// ECDSA-P-256-Schlüsselpaar erzeugen (Web Crypto API) const keyPair = await crypto.subtle.generateKey( { name: "ECDSA", namedCurve: "P-256" }, true, // extrahierbar (für Verschlüsselung + Speicherung erforderlich) ["sign", "verify"] ); // Öffentlichen Schlüssel als JWK für die Server-Registrierung exportieren const publicKeyJWK = await crypto.subtle.exportKey("jwk", keyPair.publicKey); // Privaten Schlüssel als JWK zur verschlüsselten Speicherung exportieren const privateKeyJWK = await crypto.subtle.exportKey("jwk", keyPair.privateKey);
Format des öffentlichen Schlüssels: Öffentliche Schlüssel werden im JWK-Format (JSON Web Key) exportiert und gespeichert. Der Schlüssel-Fingerprint wird als SHA-256 über das kanonische JWK berechnet, das ausschließlich die öffentlichen Felder {crv, kty, x, y} in alphabetisch sortierter Reihenfolge enthält.
Persistente private Schlüssel werden niemals im Klartext gespeichert. Bevor der private Schlüssel (als JWK-JSON exportiert) in IndexedDB geschrieben wird, wird er nach demselben Muster wie bei Secure Transfer verschlüsselt:
| Parameter | Wert |
|---|---|
| Schlüsselableitung | PBKDF2-SHA256, 600.000 Iterationen |
| Salt | Zufällige 16 Byte (pro Schlüssel) |
| Verschlüsselung | AES-256-GCM |
| IV | Zufällige 12 Byte (pro Verschlüsselung) |
| Eingabe | Privater Schlüssel als JWK (JSON-String, UTF-8-kodiert) |
| In IndexedDB gespeicherte Ausgabe | { salt, iv, ciphertext, publicKeyJWK, keyId, createdAt } |
// Datensatzstruktur in IndexedDB für einen verschlüsselten Signierschlüssel { "keyId": "uuid-v4-unique-identifier", "publicKey": { /* JWK-Format, unverschlüsselt */ }, "encryptedPrivateKey": { "salt": "base64-encoded-16-bytes", "iv": "base64-encoded-12-bytes", "ciphertext": "base64-encoded-aes-gcm-ciphertext" }, "algorithm": "ECDSA", "curve": "P-256", "createdAt": "2026-04-16T00:00:00.000Z", "userId": "supabase-auth-user-id" }
Schlüsselwiederherstellung: Vergisst der Nutzer seine Signier-Passphrase, kann der private Schlüssel nicht wiederhergestellt werden. Wir verfügen weder über die Passphrase, noch über den abgeleiteten Schlüssel, noch über einen Mechanismus, den PBKDF2 + AES-GCM-Schutz zu umgehen. Nutzer sollten Schlüssel-Backups exportieren.
PDF Pro verwendet ein Modell abgetrennter Signaturen, d. h. die Signatur wird getrennt vom Dokument gespeichert. Dies ist der entscheidende Datenschutzmechanismus: Das Dokument verlässt niemals das Gerät des Unterzeichners.
Kryptografische Zusicherung: SHA-256 ist eine Einweg-Hashfunktion. Allein anhand des Hashs e3b0c44298fc1c14... liefert sie unter den Sicherheitsannahmen von ECDSA und SHA-256 eine starke kryptografische Zusicherung, dass das Originaldokument nicht rekonstruiert werden kann. Der Hash offenbart nichts über Inhalt, Länge oder Struktur des Dokuments, abgesehen davon, dass er die Identität beim erneuten Hashen bestätigt.
Das folgende JSON-Schema definiert den vollständigen Signatur-Datensatz, der auf dem Server gespeichert wird:
{
"schemaVersion": "1.0",
"signatureId": "uuid-v4",
"documentHash": "sha256-hex-64-chars",
"hashAlgorithm": "SHA-256",
"signature": "base64-encoded-ecdsa-signature",
"signatureAlgorithm": "ECDSA",
"curve": "P-256",
"publicKey": {
"kty": "EC",
"crv": "P-256",
"x": "base64url-encoded-x-coordinate",
"y": "base64url-encoded-y-coordinate"
},
"signer": {
"identityLevel": "authenticated | self-asserted",
"displayName": "string or null",
"email": "string or null",
"userId": "supabase-uid or null"
},
"timestamp": "ISO-8601-UTC",
"metadata": {
"fileName": "original-file-name.pdf",
"fileSize": 123456,
"pageCount": 12,
"clientVersion": "2.0.0",
"userAgent": "browser-user-agent-string"
},
"auditChain": {
"previousEventHash": "sha256-of-previous-audit-event or null",
"eventHash": "sha256-of-this-record"
}
}Die Signaturverifikation ist ein zweiphasiger Prozess: clientseitige kryptografische Verifikation, gefolgt von einer serverseitigen Gegenprüfung.
const isValid = await crypto.subtle.verify( { name: "ECDSA", hash: "SHA-256" }, importedPublicKey, signatureBuffer, hashBuffer );
isValid === true, so ist die Signatur kryptografisch gültig: Das Dokument wurde seit dem Signieren nicht verändert, und die Signatur wurde vom Inhaber des zugehörigen privaten Schlüssels erzeugt.| Ergebnis | Bedeutung |
|---|---|
| Gültig (authentifiziert) | Die Signatur ist kryptografisch gültig UND der öffentliche Schlüssel gehört zu einem registrierten, authentifizierten PDF-Pro-Nutzer. |
| Gültig (selbst erklärt) | Die Signatur ist kryptografisch gültig, die Identität des Unterzeichners jedoch selbst erklärt (Gastnutzer oder nicht verifizierter Name). |
| Ungültig | Die kryptografische Verifikation ist fehlgeschlagen. Das Dokument wurde seit dem Signieren verändert, oder die Signatur ist beschädigt. |
| Widerrufen | Die Signatur war gültig, wurde jedoch vom Unterzeichner ausdrücklich widerrufen. |
| Keine Signatur gefunden | Für diesen Dokumenten-Hash existiert kein Signatur-Datensatz. |
Jedes Signier- und Verifikationsereignis wird in einem manipulationsevidenten Audit-Trail festgehalten. Die Ereignisse sind hash-verkettet: Jedes Ereignis enthält den SHA-256-Hash des vorherigen Ereignisses und bildet so eine ausschließlich anzufügende Kette, ähnlich einer Blockchain.
| Ereignistyp | Auslöser | Erfasste Daten |
|---|---|---|
KEY_REGISTERED | Nutzer registriert einen neuen öffentlichen Schlüssel | Öffentlicher Schlüssel als JWK, Nutzer-ID, Zeitstempel |
DOCUMENT_SIGNED | Nutzer signiert ein Dokument | Dokumenten-Hash, Signatur, öffentlicher Schlüssel, Identität des Unterzeichners, Zeitstempel |
SIGNATURE_VERIFIED | Ein Nutzer verifiziert eine Signatur | Dokumenten-Hash, Verifikationsergebnis, Informationen zum Prüfer (bei Authentifizierung), Zeitstempel |
SIGNATURE_REVOKED | Unterzeichner widerruft eine Signatur | Signatur-ID, Widerrufsgrund, Zeitstempel |
KEY_REVOKED | Nutzer widerruft einen öffentlichen Schlüssel | ID des öffentlichen Schlüssels, Widerrufsgrund, Zeitstempel |
// Jedes Audit-Ereignis enthält: { "eventId": "uuid-v4", "eventType": "DOCUMENT_SIGNED", "timestamp": "ISO-8601-UTC", "data": { /* ereignisspezifischer Payload */ }, "previousEventHash": "sha256-of-previous-event-json", "eventHash": "sha256-of-this-event-json-without-eventHash" } // Manipulationsdetektion: zur Prüfung der Kette berechnen: // SHA-256(JSON.stringify(Ereignis ohne eventHash-Feld)) // und bestätigen, dass dies mit eventHash übereinstimmt. // Anschließend bestätigen, dass previousEventHash dem eventHash des vorherigen Ereignisses entspricht.
Wird irgendein Ereignis in der Kette verändert, brechen alle nachfolgenden Hash-Verknüpfungen, wodurch Manipulationen sofort erkennbar werden. Dies liefert eine starke Garantie für die Integrität des Audit-Trails.
Wichtige Einschränkung: Die Hash-Kette macht Manipulationen innerhalb der aufgezeichneten Ereignisfolge erkennbar. Ein Datenbankadministrator mit direktem Zugriff könnte die Kette theoretisch jedoch löschen und rekonstruieren. Stärkere Garantien würden externe Zeitstempelung oder Drittparteien-Attestierung erfordern, was in dieser Version nicht implementiert ist.
| Stufe | Anforderungen | Vertrauenseigenschaften | Anwendungsfall |
|---|---|---|---|
| Authentifiziert | Angemeldeter PDF-Pro-Nutzer mit verifizierter E-Mail; persistentes Schlüsselpaar ist dem Konto zugeordnet | E-Mail durch Supabase Auth verifiziert; öffentlicher Schlüssel an authentifiziertes Konto gebunden; Audit-Trail mit Nutzer-ID verknüpft | Geschäftsdokumente, Verträge, formelle Vereinbarungen |
| Selbst erklärt | Gastnutzer oder authentifizierter Nutzer mit selbst eingegebenem Namen; flüchtiges oder persistentes Schlüsselpaar | Kryptografische Integrität gewährleistet; Identität des Unterzeichners ist selbst erklärt und nicht unabhängig verifiziert | Schnelles Signieren, persönliche Dokumente, informelle Vereinbarungen |
Hinweis: In der Produkt-Benutzeroberfläche kann „self_asserted" als „Selbst erklärte Identität" oder „Gastsignatur" angezeigt werden. „authenticated" kann als „Authentifiziertes Konto" angezeigt werden. Dies sind Anzeigebezeichnungen für dieselben zugrunde liegenden Identitätsstufen.
Identitätsbindung: Eine „authentifizierte" Signatur bedeutet, dass der öffentliche Schlüssel einem PDF-Pro-Konto mit verifizierter E-Mail zugeordnet ist. Sie bedeutet NICHT, dass die reale Identität des Unterzeichners durch staatlichen Ausweis, biometrische Merkmale oder persönliche Verifikation bestätigt wurde. Wir führen keine Know-Your-Customer-Prüfungen (KYC) durch.
| Bedrohung | Angriffsvektor | Gegenmaßnahme |
|---|---|---|
| Replay-Angriff | Der Angreifer kopiert eine gültige Signatur und wendet sie auf ein anderes Dokument an | Die Signatur ist an den SHA-256-Hash des konkreten Dokuments gebunden. Ein anderes Dokument besitzt einen anderen Hash, und die ECDSA-Verifikation schlägt fehl. |
| Fälschung | Der Angreifer erzeugt eine gültige Signatur ohne den privaten Schlüssel | Die Sicherheit von ECDSA P-256 basiert auf dem Elliptic-Curve-Discrete-Logarithm-Problem (ECDLP). Eine Signaturfälschung ohne privaten Schlüssel ist rechnerisch undurchführbar (128-Bit-Sicherheitsniveau). |
| Schlüsselsubstitution | Der Angreifer registriert seinen eigenen öffentlichen Schlüssel und behauptet, eine Signatur sei von jemand anderem erzeugt worden | Authentifizierte Signaturen binden den öffentlichen Schlüssel an eine verifizierte E-Mail. Der Audit-Trail erfasst, welcher Schlüssel welches Dokument signiert hat. Ereignisse der Schlüsselregistrierung sind hash-verkettet. |
| Dokumenten-Austausch | Der Angreifer verändert ein signiertes PDF und behauptet, die Signatur sei weiterhin gültig | Jede Änderung am PDF ändert dessen SHA-256-Hash. Die bestehende Signatur schlägt bei der Verifikation gegen den neuen Hash fehl. Das Auffinden einer Kollision (unterschiedliches Dokument mit gleichem Hash) erfordert ca. 2^128 Operationen. |
| Diebstahl des privaten Schlüssels | Der Angreifer extrahiert den verschlüsselten privaten Schlüssel aus IndexedDB | Der private Schlüssel ist mit AES-256-GCM verschlüsselt, der Schlüssel wurde mittels PBKDF2 (600.000 Iterationen) abgeleitet. Ohne die Passphrase ist eine Entschlüsselung rechnerisch undurchführbar. |
| Serverkompromittierung | Der Angreifer erlangt vollständigen Serverzugriff | Der Server verfügt nur über öffentliche Schlüssel und Signatur-Datensätze. Private Schlüssel erreichen den Server nie. Ein Angreifer kann keine neuen Signaturen fälschen. Er könnte bestehende Einträge löschen oder verändern, doch Brüche der Hash-Kette wären erkennbar. |
| Manipulation des Audit-Trails | Der Angreifer verändert Audit-Trail-Ereignisse auf dem Server | Hash-verkettete Ereignisse: Eine Änderung an einem Ereignis bricht die Kette ab diesem Punkt. Unabhängige Verifikationswerkzeuge können Kettenbrüche erkennen. |
Was PDF-Pro-Signaturen NICHT sind:
Unsere Verpflichtung: Wir bauen Sicherheit durch Architektur, nicht durch Marketing. Diese Whitepapers beschreiben genau, wie unsere Systeme funktionieren, einschließlich ihrer Einschränkungen. Wir glauben, dass sicherheitsbewusste Nutzer vollständige technische Transparenz verdienen. Wenn Sie Fragen zu irgendeinem Aspekt unserer Architektur haben, kontaktieren Sie uns unter info@webdesign9.com.