docs: README with architecture, security model and test instructions

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
This commit is contained in:
2026-10-11 00:04:18 +02:00
co-authored by Codebuff
parent d6f508f848
commit bb604768cc
+42 -4
View File
@@ -5,19 +5,57 @@ Sichere Datenbank für Transaktionen zwischen zwei Personen
Alle Datensätze werden **im Browser** verschlüsselt Alle Datensätze werden **im Browser** verschlüsselt
(XChaCha20-Poly1305, Schlüsselableitung per Argon2id aus der Passphrase). (XChaCha20-Poly1305, Schlüsselableitung per Argon2id aus der Passphrase).
Der Server sieht ausschließlich Chiffretext. Der Server sieht ausschließlich Chiffretext – auch bei vollständiger
Serverkompromittierung bleiben die Inhalte ohne Passphrase vertraulich.
## Starten (HTTPS, Dev mit self-signed Zertifikat) ## Starten (HTTPS, Dev mit self-signed Zertifikat)
```bash ```bash
python3 -m venv venv python3 -m venv venv
./venv/bin/pip install -r requirements.txt ./venv/bin/pip install -r requirements.txt
./run.sh ./venv/bin/python run.py
# → https://127.0.0.1:8443 # → https://127.0.0.1:8443
``` ```
Ein selbstsigniertes Zertifikat wird bei Bedarf automatisch erzeugt Ein selbstsigniertes Zertifikat wird bei Bedarf automatisch erzeugt
(`certs/`). Im Browser auftretende Zertifikatswarnungen in der (`certs/`). Zertifikatswarnungen im Browser sind in der Entwicklung
Entwicklung bestätigen. erwartet und zu bestätigen.
## Tests
```bash
./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. Siehe `spezification.txt` für die Anforderungen.