在Windows上解密sqlcipher加密数据库

时间:2014-08-11 12:19:58

标签: android encryption sqlite sqlcipher

我们正在尝试使用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。两个表的大小都相同,但我无法看到数据。

1 个答案:

答案 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();