Jak mogę bezproblemowo zintegrować SQLCipher z moją istniejącą niezaszyfrowaną bazą danych, aby moja aplikacja działała normalnie, ale teraz bazy danych są zaszyfrowane?
Ty nie. Między innymi musisz dostosować swój interfejs użytkownika, aby poprosić użytkownika o hasło i upewnić się, że możesz poprosić o to hasło w razie potrzeby (np. użytkownik wznawia zadanie z jakiejś "wewnętrznej" aktywności, a nie tylko wtedy, gdy użytkownik uruchomi za pomocą ikony programu uruchamiającego).
Chciałbym krótki samouczek na ten temat
Po pierwsze, tak nie działa Stack Overflow.
Po drugie, przyzwoite pokrycie SQLCipher dla Androida zajmuje dużo więcej niż mieści się w jednej odpowiedzi Stack Overflow. Na przykład mam w mojej książce 18-stronicowy rozdział na ten temat. Ta odpowiedź jest już dłuższa niż większość pytań dotyczących Androida i nie obwiniałbym ludzi za zamknięcie tego pytania jako zbyt szerokie.
Jak mam sprawdzić, czy baza danych jest niezaszyfrowana
Spróbuj otworzyć go za pomocą klas SQLCipher dla Androida z ""
jako hasło. Jeśli otworzy się pomyślnie, baza danych jest niezaszyfrowana. Jeśli to się nie powiedzie, albo baza danych jest uszkodzona, albo zaszyfrowana, a bez odpowiedniego hasła nie można odróżnić.
jak mogę to zaszyfrować?
Podstawowe podejście to:
-
Otwórz niezaszyfrowaną bazę danych
-
Użyj
ATTACH
Instrukcja SQL do załączenia pustego pliku, który ma służyć jako nowa zaszyfrowana baza danych, podając żądane hasło i nazywając załączoną bazę danychencrypted
w Twojej sesji bazy danych -
Uruchom
SELECT sqlcipher_export('encrypted')
w otwartej (nieszyfrowanej) bazie danych, która wyeksportuje dane z niezaszyfrowanej bazy do zaszyfrowanej (z wyjątkiem wersji schematu bazy danych, która jest obsługiwana w dalszych krokach) -
Wywołaj
getVersion()
na otwartej (niezaszyfrowanej) bazie danych i przytrzymaj tę wartość przez chwilę -
Zamknij niezaszyfrowaną bazę danych
-
Otwórz zaszyfrowaną bazę danych, używając swojego hasła
-
Wywołaj
setVersion()
w zaszyfrowanej bazie danych, dostarczając wartość zbuforowaną zgetVersion()
niezaszyfrowanej bazy danych -
Zamknij zaszyfrowaną bazę danych
-
W razie potrzeby usuń niezaszyfrowaną bazę danych i zmień nazwę zaszyfrowanej na nazwę teraz usuniętej niezaszyfrowanej, aby Twoja konwersja wyglądała na na miejscu
Ta metoda narzędziowa realizuje powyższe podejście:
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);
}
}
W interesie pełnego ujawnienia nie próbowałem tego od jakiegoś czasu, więc może być konieczne wprowadzenie pewnych poprawek.
Czy powinienem to zrobić tylko raz?
Tylko Ty możesz na to odpowiedzieć, ponieważ nikt tutaj nie będzie wiedział zbyt wiele o Twojej aplikacji.
Kiedy szyfruję moją istniejącą niezaszyfrowaną bazę danych, czy SQLCipher tworzy nową bazę danych?
Tak.
Jeśli tak, jak mam zarządzać tym nowym?
Tylko Ty możesz na to odpowiedzieć, ponieważ nikt tutaj nie będzie wiedział zbyt wiele o Twojej aplikacji.
A co z moją starą bazą danych, która jest niezaszyfrowana? Czy nadal tam pozostaje?
Tak, ale możesz go usunąć, jeśli i kiedy skończysz.