2014-02-26 118 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;剛打開並設置數據庫的密鑰。

相關問題