Sicherheit
Zero-Knowledge-Verschlüsselung
Plandaten werden auf dem Client verschlüsselt (AES-GCM). Der Verschlüsselungsschlüssel wird aus dem Passwort des Nutzers abgeleitet (PBKDF2), und in einem Duo-Plan wird er zwischen den Haushaltsmitgliedern per Schlüsselaustausch (ECDH) geteilt. Der Schlüssel erreicht den Server in keiner Form. Wir schreiben keine eigene Kryptografie — wir nutzen die native Web Crypto API des Browsers.
Das Ergebnis: Selbst mit vollem Zugriff auf die Datenbank lassen sich die Daten ohne das Passwort oder den Wiederherstellungscode des Nutzers nicht lesen.
Zugriffskontrolle (Row Level Security)
Im Cloud-Modus wird der Datenzugriff durch Postgres RLS erzwungen: Abfragen sehen
und ändern nur den Haushalt, dessen Mitglied Sie sind. Operationen wie das
Erstellen/Beitreten/Verlassen eines Haushalts oder das Speichern des Zustands laufen
über security definer-Funktionen, die die Berechtigungen kontrolliert prüfen. RLS
wirkt als zusätzliche Schicht (Defense-in-Depth) über dem Chiffretext — sie schränkt
ein, wer einen Datensatz überhaupt abrufen kann, der ohne den Schlüssel ohnehin
unlesbar ist.
Schlüssel und Geheimnisse
- Im Browser wird nur der öffentliche
anon-Schlüssel verwendet, geschützt durch RLS. - Sensible Schlüssel (z. B. Service-Role-, Zahlungsanbieter-Schlüssel) erreichen das Frontend nie — sie liegen nur auf dem Server (Umgebungsvariablen).
- Keine Geheimnisse im Repository.
Datenvalidierung
Jedes Formular und jedes Lesen des Zustands durchläuft Zod-Schemas — ungültige oder böswillige Daten erreichen die App nie. Text wird von Steuerzeichen bereinigt.
Passwörter
Passwörter werden nicht im Klartext gespeichert — Supabase hält nur einen Einweg-Hash (bcrypt). Sie lassen sich nicht lesen; sie lassen sich nur zurücksetzen oder überschreiben.
Destruktive Aktionen
Das Zurücksetzen von Daten und das Löschen Ihres Kontos erfordern eine Passwortbestätigung, um versehentlichen Datenverlust zu verhindern.
Transport und Header
Kommunikation über HTTPS, mit Sicherheits-Headern (einschließlich einer CSP).