bb604768cc0a54adecb42cbfb70b54b9b19b6e14f69c858d5dcb9ff51e43fe2d
🤖 Generated with Codebuff Co-Authored-By: Codebuff <noreply@codebuff.com>
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.
Languages
Python
78.3%
JavaScript
19.1%
CSS
2.6%