Как мога безпроблемно да интегрирам SQLCipher с моята съществуваща некриптирана база данни, така че приложението ми да работи както работи нормално, но сега базите данни са криптирани?
Вие не го правите. Наред с други неща, трябва да настроите потребителския си интерфейс, за да поискате от потребителя парола и да се уверите, че можете да поискате тази парола, ако е необходимо (например, потребителят възобновява задача от някаква „вътрешна“ дейност, а не само когато потребителят стартира вашата приложение чрез икона за стартиране).
Бих искал кратък урок за това
Първо, не така работи Stack Overflow.
Второ, приличното покритие на SQLCipher за Android отнема много повече, отколкото може да се побере в един отговор на Stack Overflow. Например в книгата си имам глава от 18 страници по темата. Този отговор вече е по-дълъг от по-голямата част от въпросите за Android и не бих обвинявал хората, че затварят този въпрос като твърде широк.
Как да проверя дали базата данни е некриптирана
Опитайте да го отворите с SQLCipher за класове за Android с ""
като парола. Ако се отвори успешно, базата данни е некриптирана. Ако това не успее, базата данни е повредена или криптирана и без правилната парола не можете да разберете разликата.
как мога да го криптирам?
Основният подход е:
-
Отворете нешифрованата база данни
-
Използвайте
ATTACH
SQL изявление за прикачване на празен файл, който да служи като новата криптирана база данни, предоставяйки желаната от вас парола и именувайки прикачената база данниencrypted
в сесията на вашата база данни -
Изпълнете
SELECT sqlcipher_export('encrypted')
в отворената (некриптирана) база данни, която ще експортира данните от некриптираната база данни в криптираната (с изключение на версията на схемата на базата данни, която се обработва в по-късни стъпки) -
Извикайте
getVersion()
в отворената (некриптирана) база данни и задръжте тази стойност за малко -
Затворете нешифрованата база данни
-
Отворете криптираната база данни, като използвате вашата парола
-
Извикайте
setVersion()
в криптираната база данни, предоставяйки стойността, която сте кеширали отgetVersion()
на некриптираната база данни -
Затворете криптираната база данни
-
Ако желаете, изтрийте нешифрованата база данни и преименувайте криптираната на името на сега изтритата некриптирана, така че преобразуването ви да изглежда да се случи на място
Този метод на помощна програма изпълнява горния подход:
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);
}
}
В интерес на пълното разкриване, не съм опитвал това от известно време, така че може да се наложи да има някои промени.
Трябва ли да направя това само веднъж?
Само вие можете да отговорите на това, тъй като никой тук няма да знае много за вашето приложение.
Когато криптирам съществуващата си некриптирана база данни, SQLCipher създава ли нова база данни?
Да.
Ако да, как трябва да управлявам този нов?
Само вие можете да отговорите на това, тъй като никой тук няма да знае много за вашето приложение.
А какво ще кажете за моята стара база данни, която е некриптирана? Остава ли още там?
Да, въпреки че можете да го изтриете, ако и когато приключите с него.