2014-02-26 85 views
2

我有一个使用System.Data.SQLite从现有应用程序中导出的加密SQLite数据库文件。基于我所能找到的,System.Data.SQLite使用128位RC4加密。Android SQLCipher RC4加密数据库文件“文件已加密或不是数据库”

当我尝试使用SQLCipher在我的Android应用程序中加载此数据库时,出现以下错误“文件已加密或不是数据库”。我试过使用数据库钩子来设置杂注键= rc4,但这似乎没有帮助。我能找到的唯一一个可以打开这个数据库文件的程序是SQLite2009 Pro Enterprise Manager。它不会打开它,允许我浏览并运行查询。

这里是代码我目前正在使用:

 try 
    { 
     SQLiteDatabase.loadLibs(activity); 

     //this function copies the db file from the project assets to the data/databases folder 
     copydatabase(); 

     File databaseFile = activity.getApplicationContext().getDatabasePath("someDB.db3"); 

     SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){ 
      public void preKey(SQLiteDatabase database){ 
       database.execSQL("pragma cipher = rc4"); 
      } 
      public void postKey(SQLiteDatabase database){ 
       database.execSQL("pragma cipher = rc4"); 
      } 
     }; 

     SQLiteDatabase database = SQLiteDatabase.openDatabase(databaseFile.getAbsolutePath(), "mypassword", null, SQLiteDatabase.NO_LOCALIZED_COLLATORS|SQLiteDatabase.OPEN_READWRITE, hook); 

     Cursor cursor = database.rawQuery("SELECT * FROM SOMETABLE;", null); 

     if (cursor.moveToFirst()){ 
      do{ 
       String data = cursor.getString(cursor.getColumnIndex("SOME_COLUMN")); 
      }while(cursor.moveToNext()); 
     } 
     cursor.close(); 
    } 
    catch(Exception ex) 
    { 
     Log.e(ex.getMessage().toString(), ex.getStackTrace().toString()); 
    } 

什么我做错了任何想法?

回答

0

看起来像我的SQLCipher Google Group有一个答案了:

如果你的SQLite数据库被SQLCipher以外的加密,你会 首先需要到数据库导出到一个纯文本的SQLite数据库。 完成之后,您可以使用sqlcipher_export便利功能 函数来创建SQLCipher加密版本数据库的纯文本 。请参阅 sqlcipher_export文档中针对您的方案的示例1 1

http://sqlcipher.net/sqlcipher-api#sqlcipher_export

0

你的数据库可能是较旧版本SQLCipher比你试图打开它的人。

尝试执行查询PRAGMA cipher_migrate;刚打开并设置数据库的密钥。

相关问题