Hoe kan ik SQLCipher naadloos integreren met mijn bestaande niet-versleutelde database, zodat mijn app werkt zoals hij normaal werkt, maar nu zijn de databases versleuteld?
Jij niet. U moet onder andere uw gebruikersinterface aanpassen om de gebruiker om een wachtwoordzin te vragen en ervoor zorgen dat u indien nodig om die wachtwoordzin kunt vragen (de gebruiker hervat bijvoorbeeld een taak vanuit een "innerlijke" activiteit, niet alleen wanneer de gebruiker uw app via een opstartpictogram).
Ik wil hier graag een korte tutorial over
Ten eerste, zo werkt Stack Overflow niet.
Ten tweede kost een behoorlijke dekking van SQLCipher voor Android veel meer dan in een enkel Stack Overflow-antwoord past. Ik heb bijvoorbeeld een hoofdstuk van 18 pagina's over het onderwerp in mijn boek. Dit antwoord is al langer dan de overgrote meerderheid van Android-vragen, en ik zou het mensen niet kwalijk nemen dat ze deze vraag als te breed sluiten.
Hoe moet ik controleren of de database niet versleuteld is
Probeer het te openen met de SQLCipher voor Android-klassen met ""
als de wachtwoordzin. Als het succesvol wordt geopend, is de database niet versleuteld. Als dat niet lukt, is de database beschadigd of versleuteld, en zonder de juiste wachtwoordzin kun je het verschil niet zien.
hoe kan ik het versleutelen?
De basisbenadering is:
-
Open de niet-versleutelde database
-
Gebruik de
ATTACH
SQL-instructie om een leeg bestand bij te voegen om als de nieuwe versleutelde database te dienen, met de gewenste wachtwoordzin en de naam van de bijgevoegde databaseencrypted
binnen uw databasesessie -
Voer de
SELECT sqlcipher_export('encrypted')
. uit in de open (niet-versleutelde) database, die de gegevens van de niet-versleutelde database naar de versleutelde database zal exporteren (met uitzondering van de versie van het databaseschema, die in latere stappen wordt behandeld) -
Bel
getVersion()
op de open (niet-versleutelde) database en houd die waarde een tijdje vast -
Sluit de niet-versleutelde database
-
Open de versleutelde database met uw wachtwoordzin
-
Bel
setVersion()
op de gecodeerde database, met de waarde die u in de cache hebt opgeslagen vangetVersion()
van de niet-versleutelde database -
Sluit de versleutelde database
-
Verwijder desgewenst de niet-versleutelde database en hernoem de versleutelde naar de naam van de nu verwijderde niet-versleutelde database, zodat uw conversie op zijn plaats lijkt te gebeuren
Deze hulpprogrammamethode implementeert de bovenstaande benadering:
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);
}
}
In het belang van volledige openbaarmaking, heb ik dit al een tijdje niet geprobeerd, en dus moeten er misschien wat aanpassingen worden gedaan.
Moet ik dit maar één keer doen?
Alleen jij kunt daar antwoord op geven, aangezien niemand hier veel over je app zal weten.
Als ik mijn bestaande niet-versleutelde database versleutel, maakt SQLCipher dan een nieuwe database?
Ja.
Zo ja, hoe moet ik deze nieuwe beheren?
Alleen jij kunt daar antwoord op geven, aangezien niemand hier veel over je app zal weten.
En hoe zit het met mijn oude database die niet versleuteld is? Blijft het daar nog steeds?
Ja, maar je bent welkom om het te verwijderen als en wanneer je er klaar mee bent.