我们正在尝试使用sqlcipher为Windows系统上的应用程序加密数据库。
以下是我们尝试加密的代码
SQLiteDatabase.loadLibs(this);
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.execSQL("create table t1(a, b)");
database.execSQL("insert into t1(a, b) values(?, ?)",
new Object[]{"one for the money",
"two for the show"});
database.close();
我们已成功加密数据库,当我们尝试解密数据库时,我们收到类似file is encrypted or database not found
的错误。
有人可以帮助解密数据库。
提前致谢:)
修改
File unencFile = getDatabasePath("Plaintext.db");
unencFile.delete();
File databaseFile = getDatabasePath("demo.db");
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
database.rawExecSQL(String.format("ATTACH DATABASE '%s' as plaintext KEY '' ", unencFile.getAbsolutePath()));
// database.rawExecSQL("ATTACH DATABASE '"+"plaintext.db"+"' AS plaintext KEY '';");
database.rawExecSQL("SELECT sqlcipher_export('plaintext');");
database.rawExecSQL("DETACH DATABASE plaintext;");
android.database.sqlite.SQLiteDatabase sqlDB = android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(unencFile, null);
sqlDB.close();
database.close();
编辑2
现在我可以获得解密的Plaintext.db文件了。但是数据库中的表名是android_metadata
而不是t1
。两个表的大小都相同,但我无法看到数据。
答案 0 :(得分:1)
您正在解密之前删除数据库文件。对代码进行更改,如下所示,然后尝试
File unencFile = getDatabasePath(PhoneNumbersDatabase.DATABASE_NAME);
unencFile.delete();
File databaseFile = getDatabasePath("demo.db");
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "test123", null);
if (database.isOpen()) {
database.rawExecSQL(String.format("ATTACH DATABASE '%s' as plaintext KEY '';",unencFile.getAbsolutePath()));
database.rawExecSQL("SELECT sqlcipher_export('plaintext');");
database.rawExecSQL("DETACH DATABASE plaintext;");
android.database.sqlite.SQLiteDatabase sqlDB = android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(unencFile, null);
sqlDB.close();
database.close();
}
databaseFile.delete();
同时更改您的数据库加密代码,如下所示 -
databaseFile.delete();
databaseFile.mkdirs();