RAMDRIVE in App nutzen - Verschlüsselung SQLite Datenbank

  • Antworten:10
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 57

06.05.2015, 15:02:09 via Website

Ich arbeite gerade an einem Projekt, welches Zugangsdaten zu dem entsprechenden Server in einer SQLite Datenbank speichert.

Diese Datenbank möchte ich gerne verschlüsseln. Nun habe ich von SQLcipher gehört. So wie ich es aber verstehe, ist die Bibliothek für kommerzielle Zwecke kostenpflichtig...

Die Datei zu verschlüsseln (mit Cipher) ist ja nicht das Problem. Jedoch, wenn die Datei entschlüsselte Datei nicht gelöscht wird (Weil Akku leer oder GEWOLLT), könnte sie ja mit einem Editor geöffnet werden.

Also ist mein Gedanke, innerhalb meines Appverzeichnisses ein TMPFS zu mounten (Über einen externen Process)...

Dorhin soll die UNVERSCHLÜSSELTE Datenbank kopiert werden. Beim beenden der App wird die Datei verschlüsselt und in den Datenbank Ordner verschoben...

Das öffnen der Datenbankdatei sollte ja von jedem Ordner aus trotzdem gehen.

Hat schonmal jemand ein RAMDRIVE in einer App integriert (Inkl. mount/umount). Oder gibts dafür vielleicht schon Möglichkeiten?

Oder vielleicht kist ja mein Lösungsansatz ganz falsch und es gibt ne ganz simple Lösung ;-)

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

06.05.2015, 18:58:49 via Website

Ich weiss jetzt natürlich nicht wie die Lib Cipher funktioniert.
Aber kannst du die DB nicht zur laufzeit enschlüsseln, sodass garnicht erst ein unverschlüsselter File gespeichert werden muss?
Wenn ja dann wäre das die einfachste Lösung.
Wenn ich es richtig weiss macht es WhatsApp mit den eigenen DBs ja so, als File sind diese Verschlüsselt und zur laufzeit werden die intern entschlüsselt ohne einen neuen File mit der entschlüsselten DB anzulegen.
Wenn du aber ein TEMPFS Mounten willst, ist für den Prozess root erforderlich. Ich denke da muss es auch noch andere wege geben

LG

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 57

06.05.2015, 22:01:57 via Website

Man kann die SQLite Datenbank auch im RAM bearbeiten (Wenn ich die Dokumentation richtig verstanden habe). Nun weiß ich aber noch nicht, wie ich die Datenbank, welche dann ja verschlüsselt ist, unverschlüsselt als Objekt bekomme...

Diese SQLCipher Bibliothek kostet 500$ für den kommerziellen Gebrauch... Wenn meine App 1000€ eingespielt hat kaufe ich gerne die Bibliothek ;)

Antworten
  • Forum-Beiträge: 72

07.05.2015, 14:06:23 via Website

Um viele viele Daten handelt es sich denn und wie groß sind diese?
Das Verschlüsseln erzeugt nicht nur einen höheren cpu load, sondern benötigt, wenn du die Database im RAM hälst, auch mehr RAM, je nachdem, welche Geräte du unterstützen willst und wie viel RAM diese besitzen, könnte dies bei einer großen Database zu einem crash führen, bzw. deine App bräuchte dann länger zum laden, wie bei Whatsapp.
Wenn du nur Zugangsdaten speichern willst, wäre es vllt. einfacher ein JSONArray zu verwenden, dieses dann als String zu verschlüsseln und in eine File zu speichern.

Antworten
  • Forum-Beiträge: 57

07.05.2015, 17:20:47 via Website

Es handelt sich nur um Serverprofile (Profilname, url, port, user, pass etc.)... Man hat meist nur ein paar Profile gespeichert. Also keine große Datenmenge.

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.182

07.05.2015, 18:25:34 via Website

Dann ist es wirklich einfacher, es irgendwie als String (json, xml etc.) zu exportieren und dann in eine Datei verschlüsseln. Beim starten liest du die Datei ein hund hälst dir die entschlüsselten Werte nur im Ram, sodass man durchs Dateisystem keine Möglichkeit hat, einen unverschlüsselten File abzufangen.

LG

— geändert am 07.05.2015, 18:25:43

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
  • Forum-Beiträge: 57

07.05.2015, 20:47:34 via Website

Die Idee ist gut, jedoch ist meine App (Schon mehrere 1000 Zeilen) komplett auf diese SQL-Datenbank ausgelegt.

Mir fällt gerade aber noch was ein...

Man könnte eine Datenbank im Speicher ohne Cache erzeugen. Theoretisch sind alle Klassen in Android serialisierbar... Ich könnte die komplette Instanz des Datenbankobjektes als verschlüsselte Datei speichern und beim App-Start die instanz wiederherstellen...

Das probier ich doch die Tage mal aus ;-)

Wenn das nicht geht, hab ich mir nochmal die Lizenzbedingungen von SQLCipher durchgelesen. Wenn man die kostenlose Version benutzt, muss man, z.B. in einem About Screen, einen Hinweis auf den Urheber der SQLCipher Bibliothek geben... Vielleicht mache ich das auch (erstmal) so... Wenn meine App och (wie erwartet :P ) höhere Einnahmen bringt, dann werde ich die Bibliothek sicher kaufen.

Antworten
  • Forum-Beiträge: 72

08.05.2015, 12:41:15 via Website

Es gibt mehrere Möglichkeiten beim Serialisieren.
Aber wenn du die Standard Serialisierung von Java verwendest, wird diese nicht nur viel Speicher benötigen, sondern auch eine hohe cpu Last erzeugen.
Eine Database benötigt auch im RAM Speicher, ohne das Daten drin sind.
Hast du keine Klasse, die die Database und die Daten managt?
Dann bräuchtest du ja nur diese verändern.

Antworten
  • Forum-Beiträge: 57

08.05.2015, 12:57:50 via Website

Ja, dass ist mir bewusst. Da die Datenbank in dem Fall nicht so groß ist, macht es keine Probleme...

Ja, ich habe eine Klasse, die die nötigen CRUD Befehle enthält.

Aber das ist ne Idee... Ich könnte ja wirklich nur die Daten verschlüsseln... Die Struktur der Datenbank ist ja (eigentlich) egal...

So könnte ich die Daten vor einem INSERT/UPDATE durch einen Cipher jagen und dann die Daten im BASE64 Format speichern... Das ist eine Idee... Das könnte (evtl braucht man das ja mal) auch mit BLOBs funktionieren...

Den Schlüssel müsste man individuell aus ein paar konstanten Werten berechnen... Das hat den Vorteil, dass die Daten nur auf diesem Gerät entschlüsselt werden können...

Antworten
  • Forum-Beiträge: 72

08.05.2015, 15:40:16 via Website

Das ist richtig. :D
Wenn du nur die benötigten Daten verschlüsselst, ist die App auch sehr schnell. :D

MOSDEV

Antworten

Empfohlene Artikel