Hur kan jag sömlöst integrera SQLCipher med min befintliga okrypterade databas, så att min app fungerar som den fungerar normalt men nu är databaserna krypterade?
Det gör du inte. Bland annat måste du justera ditt användargränssnitt för att be användaren om en lösenfras och se till att du kan be om den lösenfrasen efter behov (t.ex. återupptar användaren en uppgift från någon "inre" aktivitet, inte bara när användaren kör din app via en startikon).
Jag skulle vilja ha en kort handledning om detta
För det första är det inte så Stack Overflow fungerar.
För det andra kräver anständig täckning av SQLCipher för Android mycket mer än vad som ryms i ett enda Stack Overflow-svar. Jag har till exempel ett 18-sidigt kapitel om ämnet i min bok. Det här svaret är redan längre än de allra flesta Android-frågor, och jag skulle inte klandra folk för att de avslutar den här frågan som för bred.
Hur ska jag kontrollera om databasen är okrypterad
Testa att öppna den med SQLCipher för Android-klasser med ""
som lösenfrasen. Om den öppnas framgångsrikt är databasen okrypterad. Om det misslyckas är databasen antingen korrupt eller krypterad, och utan rätt lösenfras kan du inte se skillnad.
hur kan jag kryptera det?
Det grundläggande tillvägagångssättet är:
-
Öppna den okrypterade databasen
-
Använd
ATTACH
SQL-sats för att bifoga en tom fil som ska fungera som den nya krypterade databasen, ange önskad lösenfras och namnge den bifogade databasenencrypted
i din databassession -
Kör
SELECT sqlcipher_export('encrypted')
i den öppna (okrypterade) databasen, som kommer att exportera data från den okrypterade databasen till den krypterade (med undantag för databasschemaversionen, som hanteras i senare steg) -
Anrop
getVersion()
på den öppna (okrypterade) databasen och håll kvar det värdet en stund -
Stäng den okrypterade databasen
-
Öppna den krypterade databasen med din lösenfras
-
Anrop
setVersion()
i den krypterade databasen och tillhandahåller värdet du cachelagrade frångetVersion()
av den okrypterade databasen -
Stäng den krypterade databasen
-
Om så önskas, ta bort den okrypterade databasen och byt namn på den krypterade till namnet på den nu raderade okrypterade, så att din konvertering verkar ske på plats
Denna verktygsmetod implementerar ovanstående tillvägagångssätt:
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);
}
}
Jag har inte provat det här på ett tag för att det ska vara fullständigt uppenbart, så det kan behöva göras några justeringar.
Ska jag göra detta bara en gång?
Det är bara du som kan svara på det, eftersom ingen här kommer att veta mycket om din app.
Skapar SQLCipher en ny databas när jag krypterar min befintliga okrypterade databas?
Ja.
Om ja, hur ska jag hantera den här nya?
Det är bara du som kan svara på det, eftersom ingen här kommer att veta mycket om din app.
Och hur är det med min gamla databas som är okrypterad? Står den kvar där?
Ja, men du är välkommen att radera den om och när du är klar med den.