0
我有一个使用SQLCipher进行数据库加密的Android应用程序。该应用程序已上线,并有许多活跃的用户。我正在寻找一种解决方案,它可以从应用程序的现有数据库中删除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数据库。这将是我显示[在此堆栈溢出答案](https://stackoverflow.com/a/29867682/115145)中的'encrypt()'方法的反函数。 – CommonsWare
如果你只是想解密数据库,并继续使用sqlcipher lib,我认为你可以'重新键入'空数据库的新密码,但如果你想移动到android集成的sqlite你必须采取将数据从旧数据库迁移到新数据库。 – Yazan