test: SQLCipher auf Android-Emulator verifiziert (Neuanlage verschluesselt, Klartext-Migration, Neustart ohne Re-Migration)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bernd Steckmeister
2026-07-06 18:28:25 +02:00
parent 9693174de9
commit f2b9afbfea
4 changed files with 80 additions and 6 deletions
+53
View File
@@ -13,6 +13,59 @@ Schritt (und beim Abbruch mitten im Schritt den Zwischenstand). Format:
--- ---
## 2026-07-06 SQLCipher auf ANDROID getestet (Emulator API 36): Neuanlage, Migration und Neustart grün
**Erledigt:** Der größte offene Teil von Testplan Punkt 4
(`docs/SQLCIPHER_MIGRATION.md`) ist jetzt real auf Android belegt kein
Gerät angeschlossen, aber der vorhandene Emulator (Medium Phone API 36.1,
x86_64, MIT Play Services) reicht für die DB-Schicht:
- **Szenario A frische Installation:** Debug-APK installiert, App
gestartet → `pyramid.sqlite` wird von Anfang an VERSCHLÜSSELT angelegt
(Header = Zufallsbytes statt „SQLite format 3", per `run-as`/`od`
verifiziert); auth_log ohne Cipher-Fallback oder Fehler.
- **Szenario B Update-Szenario (Utas Fall):** `pm clear` (auch der
Keystore-Eintrag weg) + synthetische Klartext-DB (2 Tabellen, 550
Zeilen) VOR dem ersten Start in `files/` gelegt → beim Start lief die
echte Migration: auth_log „Klartext-DB erfolgreich nach SQLCipher
migriert (2 Tabellen verifiziert)", `.premigration`-Backup liegt da,
DB danach verschlüsselt, App lief normal weiter (Login-Screen,
Screenshot geprüft). **Bewusst NICHT mit Bernds echter DB getestet**
die enthält seine Session/Olm-Account, ein Duplikat auf einem zweiten
„Gerät" würde den E2EE-State korrumpieren.
- **Szenario C Neustart:** force-stop + Relaunch → verschlüsselte DB
öffnet mit dem Schlüssel aus dem Android-Keystore, KEINE zweite
Migration, kein Fehler. Damit sind `openCipherOnAndroid`,
`sqlcipher_export` und flutter_secure_storage auf Android
(Haupt-Isolate) praktisch belegt.
- Doku nachgezogen: Status-Kopf `docs/SQLCIPHER_MIGRATION.md`,
ROADMAP-M1-Vermerk. Emulator danach heruntergefahren. Nebenbei:
`android/gradle.properties` bekam beim APK-Build automatisch zwei
Flutter-Migrator-Flags (`builtInKotlin=false`, `newDsl=false` pinnt
bestehendes Verhalten), mit committet.
**UNGETESTET bleibt (ROADMAP-Punkt weiter NICHT abgehakt):** echtes
ARM-Gerät, Migration einer ECHTEN eingeloggten Session auf Android und
der Push-Test (FCM-Background-Isolate liest verschlüsselte DB,
secure_storage im Background-Isolate) braucht ein Testgerät mit
eingeloggtem Account (Login-Daten hat nur Bernd). Erst danach Release
und Utas Gerät.
**Offen/Nächster Schritt:** auth_log-Check des weiterlaufenden
Windows-Beobachtungslaufs (Einträge seit 2026-07-06 18:19). Für Bernd
unverändert: PC_TESTPLAN 1 (Rest) + 28 durchklicken; fürs
SQLCipher-Finale ein echtes Android-Gerät anstecken (Debug-Build reicht,
Ablauf wie hier im Emulator).
**Stolperfallen:** (1) Ein Dart-Skript außerhalb des Repos kann
`package:`-Imports nicht auflösen Hilfsskripte kurz ins Repo legen
(`tool/`, untracked) und nach dem Lauf löschen. (2) Für Datei-Zugriff im
App-Sandbox-Verzeichnis braucht es eine DEBUG-APK (`run-as` geht nur bei
debuggable); das Emulator-Image hat kein `sqlite3`-Binary Test-DBs
also am PC bauen und pushen.
---
## 2026-07-06 auth_log-Check 17:43-Fenster: echter ~7-min-Netzausfall OHNE Logout überstanden (stärkster Positiv-Befund bisher) ## 2026-07-06 auth_log-Check 17:43-Fenster: echter ~7-min-Netzausfall OHNE Logout überstanden (stärkster Positiv-Befund bisher)
**Erledigt:** Vierte PC-Session, zuerst der Pflicht-Check der Vorsession **Erledigt:** Vierte PC-Session, zuerst der Pflicht-Check der Vorsession
+7 -3
View File
@@ -48,9 +48,13 @@ Punkte abhaken (`[x]`), wenn erledigt UND in `PROGRESS.md` protokolliert.
Backup/Verifikation/atomarem Tausch, Push-Isolate-Marker). Bernds echte Backup/Verifikation/atomarem Tausch, Push-Isolate-Marker). Bernds echte
Windows-DB wurde erfolgreich migriert (PROGRESS.md 2026-07-06), Tests in Windows-DB wurde erfolgreich migriert (PROGRESS.md 2026-07-06), Tests in
`test/app_database_test.dart` fahren die Migration mit echtem SQLCipher. `test/app_database_test.dart` fahren die Migration mit echtem SQLCipher.
**Bleibt offen, weil Android UNGETESTET ist** (Migration auf Gerät, **Nachtrag 2026-07-06 (vierte PC-Session): Android-EMULATOR-Test grün**
Push-Isolate liest verschlüsselte DB, secure_storage im (API 36: Neuanlage verschlüsselt, Klartext-Migration beim ersten Start,
Background-Isolate) Testplan Punkt 4 in `docs/SQLCIPHER_MIGRATION.md`; Neustart mit Keystore-Schlüssel ohne Re-Migration Details im
Status-Kopf von `docs/SQLCIPHER_MIGRATION.md`). **Bleibt offen:**
echtes ARM-Gerät mit eingeloggter Session + Push-Isolate-Test
(FCM liest verschlüsselte DB, secure_storage im Background-Isolate)
Testplan Punkt 4 in `docs/SQLCIPHER_MIGRATION.md`;
erst nach grünem Gerätetest Release + Utas Gerät (vorher ihr Key-Backup erst nach grünem Gerätetest Release + Utas Gerät (vorher ihr Key-Backup
prüfen!), dann abhaken. prüfen!), dann abhaken.
`sqlcipher_flutter_libs` steht zwar in `pubspec.yaml`, wird aber nirgends `sqlcipher_flutter_libs` steht zwar in `pubspec.yaml`, wird aber nirgends
+4
View File
@@ -1,2 +1,6 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true android.useAndroidX=true
# This builtInKotlin flag was added automatically by Flutter migrator
android.builtInKotlin=false
# This newDsl flag was added automatically by Flutter migrator
android.newDsl=false
+16 -3
View File
@@ -4,9 +4,22 @@
> Windows mit Bernds echter 14-MB-DB praxisgetestet** (Migration gelaufen, > Windows mit Bernds echter 14-MB-DB praxisgetestet** (Migration gelaufen,
> 23 Tabellen verifiziert, Login/E2EE danach intakt, Neustart öffnet die > 23 Tabellen verifiziert, Login/E2EE danach intakt, Neustart öffnet die
> verschlüsselte DB, `flutter test` deckt Migration/Fehlpfade mit echtem > verschlüsselte DB, `flutter test` deckt Migration/Fehlpfade mit echtem
> SQLCipher ab). **Android bleibt UNGETESTET** (Punkt 4 des Testplans unten: > SQLCipher ab).
> Migration auf Gerät, Push-Isolate + secure_storage) erst danach Release > **Android-Emulator-Test 2026-07-06 (API 36, x86_64, Debug-APK) GRÜN:**
> und Uta. **Abweichung vom Plan unten:** Die Annahme „keine Desktop-Binaries" > (a) frische Installation legt die DB direkt verschlüsselt an
> (Header = Zufallsbytes, per run-as verifiziert), kein Cipher-Fallback im
> auth_log; (b) Update-Szenario nach `pm clear` + untergeschobener
> Klartext-DB (synthetisch, 2 Tabellen/550 Zeilen): Migration lief beim
> ersten Start („2 Tabellen verifiziert" im auth_log), `.premigration`
> liegt da, DB danach verschlüsselt; (c) Neustart öffnet mit dem
> Keystore-Schlüssel OHNE Re-Migration, App rendert normal den
> Login-Screen. Damit sind openCipherOnAndroid, sqlcipher_export und
> flutter_secure_storage auf Android (Haupt-Isolate) real belegt.
> **Offen bleibt (deshalb Punkt 4 NICHT voll abgehakt):** echtes
> ARM-Gerät, Migration einer ECHTEN eingeloggten Session auf Android und
> der Push-Test (FCM-Isolate liest verschlüsselte DB, secure_storage im
> Background-Isolate) braucht ein Testgerät mit eingeloggtem Account.
> Erst danach Release und Uta. **Abweichung vom Plan unten:** Die Annahme „keine Desktop-Binaries"
> ist seit sqlcipher_flutter_libs 0.6.x überholt das Plugin baut SQLCipher > ist seit sqlcipher_flutter_libs 0.6.x überholt das Plugin baut SQLCipher
> auf Windows/Linux als `sqlite3.dll`/`libsqlite3.so` mit (im Build-Output > auf Windows/Linux als `sqlite3.dll`/`libsqlite3.so` mit (im Build-Output
> verifiziert). Deshalb ist Phase 1 NICHT Android-only: Windows/Linux > verifiziert). Deshalb ist Phase 1 NICHT Android-only: Windows/Linux