Jak mohu bez problémů integrovat SQLCipher se svou stávající nešifrovanou databází, aby moje aplikace fungovala jako normálně, ale nyní jsou databáze šifrované?
Ty ne. Kromě jiného musíte upravit své uživatelské rozhraní tak, aby uživatele požádalo o přístupovou frázi, a zajistit, abyste o tuto přístupovou frázi mohli požádat podle potřeby (např. uživatel obnoví úlohu z nějaké „vnitřní“ aktivity, nejen když uživatel spustí vaši aplikace prostřednictvím spouštěcí ikony).
Chtěl bych na to krátký tutoriál
Za prvé, takto Stack Overflow nefunguje.
Za druhé, slušné pokrytí SQLCipher pro Android zabere hodně více, než se vejde do jediné odpovědi Stack Overflow. Ve své knize mám na toto téma například 18stránkovou kapitolu. Tato odpověď je již delší než naprostá většina otázek pro Android a nevinil bych lidi, že tuto otázku uzavřeli jako příliš širokou.
Jak mám zkontrolovat, zda je databáze nezašifrovaná
Zkuste jej otevřít pomocí tříd SQLCipher pro Android s ""
jako přístupová fráze. Pokud se úspěšně otevře, databáze je nešifrovaná. Pokud to selže, databáze je buď poškozená, nebo zašifrovaná, a bez správné přístupové fráze nepoznáte rozdíl.
jak to mohu zašifrovat?
Základní přístup je:
-
Otevřete nezašifrovanou databázi
-
Použijte
ATTACH
Příkaz SQL pro připojení prázdného souboru, který bude sloužit jako nová šifrovaná databáze, poskytne požadovanou přístupovou frázi a pojmenuje připojenou databáziencrypted
v rámci relace databáze -
Spusťte
SELECT sqlcipher_export('encrypted')
v otevřené (nešifrované) databázi, která vyexportuje data z nešifrované databáze do šifrované (s výjimkou verze schématu databáze, která je řešena v dalších krocích) -
Zavolejte
getVersion()
v otevřené (nešifrované) databázi a chvíli podržte tuto hodnotu -
Zavřete nešifrovanou databázi
-
Otevřete zašifrovanou databázi pomocí své přístupové fráze
-
Zavolejte
setVersion()
v zašifrované databázi, poskytující hodnotu, kterou jste uložili do mezipaměti zgetVersion()
nešifrované databáze -
Zavřete šifrovanou databázi
-
Pokud chcete, smažte nešifrovanou databázi a přejmenujte šifrovanou na název nyní smazané nešifrované databáze, aby se zdálo, že se konverze uskutečnila na místě
Tato metoda nástroje implementuje výše uvedený přístup:
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);
}
}
V zájmu úplného odhalení jsem to už nějakou dobu nezkoušel, takže možná bude potřeba provést nějaké úpravy.
Mám to udělat pouze jednou?
Na to můžete odpovědět pouze vy, protože nikdo tady o vaší aplikaci moc neví.
Když zašifruji svou stávající nezašifrovanou databázi, vytvoří SQLCipher novou databázi?
Ano.
Pokud ano, jak bych měl spravovat tento nový?
Na to můžete odpovědět pouze vy, protože nikdo tady o vaší aplikaci moc neví.
A co moje stará databáze, která je nešifrovaná? Stále tam zůstává?
Ano, i když jej můžete smazat, pokud a až s tím skončíte.