Messaging: Ende-zu-Ende-Verschlüsselung (E2EE) #96
Labels
No labels
block-planning
bug
documentation
duplicate
enhancement
feature
good first issue
help wanted
infrastructure
invalid
planning
priority:high
priority:low
question
refactoring
status:backlog
status:done
status:in-progress
status:todo
tech-decision
test
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: bollwerkadmin/bollwerk#96
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Ziel
Ende-zu-Ende-Verschlüsselung (E2EE) für Nachrichten implementieren – ähnlich zu PGP. Nachrichten werden auf dem Sendegerät mit dem öffentlichen Schlüssel des Empfängers verschlüsselt und können nur auf dem Empfängergerät mit dem zugehörigen privaten Schlüssel entschlüsselt werden. Der Server sieht ausschließlich Chiffrat.
Kryptografisches Konzept
box-Primitive; alternativ RSA-OAEP + AES-GCMFunktionale Anforderungen
App-Seite: Schlüsselverwaltung
Initiale Schlüsselerzeugung
Schlüsselerneuerung (Key Rotation) in den Settings
Lokale Persistenz
EncryptedSharedPreferencesgespeichertApp-Seite: Nachrichten
Versenden
Empfangen
Server-Seite
Public Key Endpunkt
PUT /users/{id}/public-key– speichert / aktualisiert den Public Key eines UsersGET /users/{id}/public-key– gibt den aktuellen Public Key zurückDatenbankschema (Server, Ergänzung)
users: neue Spaltepublic_key TEXT(Base64-kodierter Public Key)Key-Rotation Push-Notification
PUT /users/{id}/public-key), sendet der Server eine WebSocket-Push-Nachricht an alle anderen verbundenen Clients:Nachrichtenspeicherung
messages-Tabelle, jedoch nur als Chiffrat (bodyenthält den verschlüsselten Blob)Nicht im Scope
Abhängigkeiten
Akzeptanzkriterien
Migration / Bestehende App-Installationen
🔴 Schlüsselpaar-Initialisierung beim Update
Bestehende User haben beim Update auf die E2EE-Version noch kein Schlüsselpaar. Die App muss beim Start prüfen, ob ein Schlüsselpaar vorhanden ist, und es bei Bedarf transparent generieren + Public Key an den Server melden.
Empfehlung: Eine EnsureKeyPairUseCase-Komponente, die in MainActivity.onCreate (neben SeedDatabaseUseCase) aufgerufen wird:
if (keinSchlüsselpaarVorhanden) { generiereSchlüsselpaar() meldePublicKeyAnServer() }🔴 fallbackToDestructiveMigration – Risiko für Schema-Änderungen
DatabaseModule verwendet allbackToDestructiveMigration(). Wenn E2EE ein neues Room-Schema erfordert, muss eine saubere @AutoMigration oder manuelle Migration implementiert werden. Der Fallback-Mechanismus darf bei dieser Feature-Entwicklung nicht greifen.
🟡 Bestehende Nachrichten (Plaintext-Altbestand)
Nachrichten vor der E2EE-Einführung sind unverschlüsselt in der DB. Klare Policy: Alte Nachrichten bleiben unkryptiert und werden als solche dargestellt; ab dem Feature-Go-live werden ausschließlich neue Nachrichten verschlüsselt übertragen.
Migration / Bestehende App-Installationen
Schlüsselpaar-Initialisierung beim Update (kritisch)
Bestehende User haben beim Update auf die E2EE-Version noch kein Schlüsselpaar. Die App muss beim Start prüfen, ob ein Schlüsselpaar vorhanden ist, und es bei Bedarf transparent generieren + Public Key an den Server melden. Empfehlung: EnsureKeyPairUseCase in MainActivity.onCreate neben SeedDatabaseUseCase aufrufen.
fallbackToDestructiveMigration – Risiko (kritisch)
DatabaseModule verwendet fallbackToDestructiveMigration(). Wenn E2EE ein neues Room-Schema erfordert (z.B. Speicherung des eigenen PublicKey in DB), MUSS eine saubere @AutoMigration oder manuelle Migration implementiert werden. Der Fallback darf nicht greifen.
Bestehende Nachrichten (Plaintext-Altbestand)
Nachrichten vor der E2EE-Einführung sind unverschlüsselt. Klare Policy: Alte Nachrichten bleiben unkryptiert dargestellt; ab Feature-Go-live werden nur neue Nachrichten verschlüsselt übertragen.
Abgeschlossen (2026-05-18)
Zyklen: 2 (1 Implementierung + 1 Review-Korrektur)
Tests: ✅ 320 Tests, 0 Fehler
Implementierte Artefakte
Abweichungen
Follow-up