У меня есть приложение для Android, которое использует SQLCipher для шифрования базы данных. Приложение заработало и имеет много активных пользователей. Я ищу решение, которое может удалить шифрование SQLCipher из существующей базы данных приложения без потери данных пользователя.Удалить шифрование SQLCipher из базы данных моего существующего приложения
Я попытался сделать обратное тому, что упоминается в сообщении this, но не смог открыть файл зашифрованной базы данных.
public static void decrypt(Context ctxt, String dbName, String passphrase)
throws IOException {
try {
File originalFile = ctxt.getDatabasePath(dbName);
int version = 0;
if (originalFile.exists()) {
File newFile = File.createTempFile("sqlite", "tmp", ctxt.getCacheDir());
net.sqlcipher.database.SQLiteDatabase dbCipher = net.sqlcipher.database.SQLiteDatabase.openDatabase(
originalFile.getAbsolutePath(), passphrase, null,
net.sqlcipher.database.SQLiteDatabase.OPEN_READWRITE);
if (dbCipher.isOpen()) {
dbCipher.rawExecSQL(String.format(
"ATTACH DATABASE '%s' AS plaintext KEY '%s';",
newFile.getAbsolutePath(), passphrase));
dbCipher.rawExecSQL("SELECT sqlcipher_export('plaintext')");
dbCipher.rawExecSQL("DETACH DATABASE plaintext;");
version = dbCipher.getVersion();
dbCipher.close();
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(newFile, null);
db.setVersion(version);
db.close();
originalFile.delete();
newFile.renameTo(originalFile);
}
} catch (Exception e) {
e.printStackTrace();
}
}
И вот журналы ошибок, которые я получил ...
06-04 11:33:54.929: E/SQLiteLog(12309): (26) file is encrypted or is not a database
06-04 11:33:54.929: E/DefaultDatabaseErrorHandler(12309): Corruption reported by sqlite on database: /data/data/ril.jio.protrak/cache/sqlite1817652413tmp
Создание регулярной базы данных SQLite, откройте SQLCipher и скопировать данные из базы данных SQLCipher в базу данных SQLite. Это будет обратный метод 'encrypt()', который я покажу [в этом ответе переполнения стека] (https://stackoverflow.com/a/29867682/115145). – CommonsWare
, если вы просто хотите расшифровать db и продолжать использовать sqlcipher lib, я думаю, вы можете просто «переустановить» db с пустым новым паролем, но если вы хотите перейти к интегрированному с Android-сайтом sqlite, вы должны принять подход перенос данных из старой в новую БД. – Yazan