SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Verwenden von SQLCipher mit Android

Wie kann ich SQLCipher nahtlos in meine vorhandene unverschlüsselte Datenbank integrieren, sodass meine App wie gewohnt funktioniert, aber jetzt die Datenbanken verschlüsselt sind?

Du nicht. Unter anderem müssen Sie Ihre Benutzeroberfläche anpassen, um den Benutzer nach einer Passphrase zu fragen, und sicherstellen, dass Sie diese Passphrase bei Bedarf anfordern können (z App über ein Launcher-Symbol).

Ich hätte gerne eine kurze Anleitung dazu

Erstens funktioniert Stack Overflow nicht so.

Zweitens braucht eine anständige Abdeckung von SQLCipher für Android viel mehr als in eine einzige Stack Overflow-Antwort passen. Ich habe zum Beispiel in meinem Buch ein 18-seitiges Kapitel zu diesem Thema. Diese Antwort ist bereits länger als die überwiegende Mehrheit der Android-Fragen, und ich würde den Leuten nicht vorwerfen, dass sie diese Frage als zu weit gefasst schließen.

Wie soll ich überprüfen, ob die Datenbank unverschlüsselt ist

Versuchen Sie, es mithilfe der SQLCipher für Android-Klassen mit "" zu öffnen als Passphrase. Wenn es erfolgreich geöffnet wird, ist die Datenbank unverschlüsselt. Wenn dies fehlschlägt, ist entweder die Datenbank beschädigt oder verschlüsselt, und ohne die richtige Passphrase können Sie den Unterschied nicht erkennen.

wie kann ich es verschlüsseln?

Der grundlegende Ansatz ist:

  • Öffnen Sie die unverschlüsselte Datenbank

  • Verwenden Sie den ATTACH SQL-Anweisung, um eine leere Datei anzuhängen, die als neue verschlüsselte Datenbank dienen soll, geben Sie Ihre gewünschte Passphrase an und benennen Sie die angehängte Datenbank encrypted innerhalb Ihrer Datenbanksitzung

  • Führen Sie SELECT sqlcipher_export('encrypted') aus in der offenen (unverschlüsselten) Datenbank, wodurch die Daten aus der unverschlüsselten Datenbank in die verschlüsselte exportiert werden (mit Ausnahme der Datenbankschemaversion, die in späteren Schritten behandelt wird)

  • Rufen Sie getVersion() auf in der offenen (unverschlüsselten) Datenbank und halten Sie diesen Wert für eine Weile fest

  • Schließen Sie die unverschlüsselte Datenbank

  • Öffnen Sie die verschlüsselte Datenbank mit Ihrer Passphrase

  • Rufen Sie setVersion() auf in der verschlüsselten Datenbank, indem Sie den Wert bereitstellen, den Sie von getVersion() zwischengespeichert haben der unverschlüsselten Datenbank

  • Schließen Sie die verschlüsselte Datenbank

  • Falls gewünscht, löschen Sie die unverschlüsselte Datenbank und benennen Sie die verschlüsselte in den Namen der jetzt gelöschten unverschlüsselten um, sodass Ihre Konvertierung tatsächlich stattzufinden scheint

Diese Hilfsmethode implementiert den obigen Ansatz:

  public static void encrypt(Context ctxt, String dbName,
                             String passphrase) throws IOException {
    File originalFile=ctxt.getDatabasePath(dbName);

    if (originalFile.exists()) {
      File newFile=
          File.createTempFile("sqlcipherutils", "tmp",
                              ctxt.getCacheDir());
      SQLiteDatabase db=
          SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(),
                                      "", null,
                                      SQLiteDatabase.OPEN_READWRITE);

      db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
                                  newFile.getAbsolutePath(), passphrase));
      db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
      db.rawExecSQL("DETACH DATABASE encrypted;");

      int version=db.getVersion();

      db.close();

      db=
          SQLiteDatabase.openDatabase(newFile.getAbsolutePath(),
                                      passphrase, null,
                                      SQLiteDatabase.OPEN_READWRITE);
      db.setVersion(version);
      db.close();

      originalFile.delete();
      newFile.renameTo(originalFile);
    }
  }

Im Interesse einer vollständigen Offenlegung habe ich dies eine Weile nicht ausprobiert, daher müssen möglicherweise einige Änderungen vorgenommen werden.

Soll ich das nur einmal machen?

Das können nur Sie beantworten, da niemand hier viel über Ihre App wissen wird.

Wenn ich meine vorhandene unverschlüsselte Datenbank verschlüssele, erstellt SQLCipher dann eine neue Datenbank?

Ja.

Wenn ja, wie soll ich dieses neue verwalten?

Das können nur Sie beantworten, da niemand hier viel über Ihre App wissen wird.

Und was ist mit meiner alten Datenbank, die unverschlüsselt ist? Bleibt es immer noch dort?

Ja, aber Sie können es gerne löschen, wenn und wenn Sie damit fertig sind.