crushdb – verschlüsselte Datensätze zwischen Personen

Sichere Datenbank für Transaktionen zwischen zwei Personen (Person A, Person B, Timestamp-Start, Timestamp-Ende, Aktion).

Alle Datensätze werden im Browser verschlüsselt (XChaCha20-Poly1305, Schlüsselableitung per Argon2id aus der Passphrase). Der Server sieht ausschließlich Chiffretext – auch bei vollständiger Serverkompromittierung bleiben die Inhalte ohne Passphrase vertraulich.

Starten (HTTPS, Dev mit self-signed Zertifikat)

python3 -m venv venv
./venv/bin/pip install -r requirements.txt
./venv/bin/python run.py
# → https://127.0.0.1:8443

Ein selbstsigniertes Zertifikat wird bei Bedarf automatisch erzeugt (certs/). Zertifikatswarnungen im Browser sind in der Entwicklung erwartet und zu bestätigen.

Tests

./venv/bin/python -m pytest backend/test_integrity.py -v   # Integrität/Replay
node .e2e.mjs  # optional: End-to-End (siehe unten)

Architektur

Komponente Datei Aufgabe
Speicher backend/storage.py SQLite, speichert nur Chiffretext (uuid, ciphertext, nonce, salt, version)
API backend/app.py Flask REST API, Validierung nur von Form/Größe, Versions-Konfliktprüfung
Krypto (Client) backend/static/crypto.js Argon2id-KDF + XChaCha20-Poly1305, uuid+salt als AEAD-AAD gebunden
UI backend/static/ui.js + index.html/style.css Tabelle, Erstellen, Bearbeiten, Löschen; Passphrase bleibt im RAM
Server run.py HTTPS (self-signed Dev-Zertifikat), DB-Init

Sicherheitsmodell

  • Passphrase → Argon2id (t=2, m=16 MiB) → 256-Bit-Sitzungsschlüssel, ausschließlich im Browser/im Arbeitsspeicher; niemals am Server.
  • Jeder Datensatz: eigene zufällige 16-Byte-Salt + 24-Byte-Nonce. uuid + salt sind als AEAD-Associated-Data gebunden – Vertauschen oder Um-Salten wird beim Entschlüsseln sicher erkannt.
  • Monotoner Versionszähler pro Datensatz: veraltete Updates/Deletes (Replay alter Stände) → 409, Duplikate → 409.
  • Klartexte werden clientseitig nie persistiert; beim Sperren/Beenden wird der Schlüssel verworfen (wipeKey).
  • HTTPS (Dev: self-signed; Prod: eigenes Zertifikat hinterlegen).

Bekannte Grenzen

  • Datenverlust (Löschen/Überschreiben) durch Angreifer bleibt möglich – Vertraulichkeit ist geschützt, Verfügbarkeit nicht.
  • Backups der SQLite-Datei enthalten ausschließlich Chiffretext.
  • Backups des Passphrasen-Verlusts = Datenverlust (by design).

Siehe spezification.txt für die Anforderungen.

S
Description
a secure database for saving transaktions betwen persons
Readme MIT
208 KiB
Languages
Python 78.3%
JavaScript 19.1%
CSS 2.6%