2013-11-02 94 views
1

我正在研究使用sqlcipher加密的數據庫的應用程序。該加密的密碼由緩存字存儲。無法將sqlcipher加密數據庫附加到另一個

爲了使我的數據庫備份我用下面的代碼:

// ggf. Datenbank öffnen 
openGuard(); 
mDb.execSQL("ATTACH DATABASE '" + outFileName + "' AS backup KEY 'asdfghjkl';"); 
mDb.rawExecSQL("SELECT sqlcipher_export('backup');"); 
mDb.execSQL("DETACH DATABASE backup;"); 

的方法openGuard()用於檢查數據庫尚未運行結束,如果不能做到這一點。

我已通過使用空鍵檢查備份,以製作未加密的數據庫副本。然後,我可以在adb shell上使用它,並使用sql語句獲取所需的數據。

我現在很長一段時間的問題是,我無法使用我的備份來恢復我的應用程序的數據庫。我想這樣的代碼:

SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(backupFile, "asdfghjkl", null); 
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + mCacheWord.getEncryptionKey() + "';"); 
db.rawExecSQL("SELECT sqlcipher_export('encrypted')"); 
db.rawExecSQL("DETACH DATABASE encrypted;"); 

或者我試圖

db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + encodeRawKey(mCacheWord.getEncryptionKey()) + "';"); 

但在這兩種情況下,我得到了以下錯誤消息:

10-30 00:56:42.845: I/Database(14407): sqlite returned: error code = 26, msg = statement aborts at 5: [ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[[email protected]';] file is encrypted or is not a database 
10-30 00:56:42.845: E/Database(14407): Failure 26 (file is encrypted or is not a database) on 0x63bdedb0 when executing 'ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[[email protected]';' 

是否有任何人如何能幫助我與我的問題?

回答

0

看起來你已經意外地「掛斷了」試圖通過提供密鑰通過聲明解密。看看Example 2: Decrypt a SQLCipher database to a Plaintext Database的API,有一條評論,其內容爲-- empty key will disable encryption。所以,想必您最初的解密代碼嘗試首先應該執行PRAGMA key =聲明(提供鍵),然後ATTACH DATABASE聲明空鍵(解密)是這樣的:

db.execSQL("PRAGMA key = '" + mCacheWord.getEncryptionKey() + "';"); 
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '';"); 
db.rawExecSQL("SELECT sqlcipher_export('encrypted')"); 
db.rawExecSQL("DETACH DATABASE encrypted;"); 

另一個關於這個簡單的例子可以在這個the SQLCipher Users mailing list的討論中看到。

+0

我最近檢查了這個建議,但沒有幫助。謝謝! – user2836375

0

我認爲這個問題可能與您使用CacheWord這一事實有關,它使用SQLCipher單獨管理加密密鑰。您應驗證從getEncryptionKey()返回的字符串的格式,並確保它匹配SQLCIpher中原始密鑰的正確格式。

+0

我認爲這是問題,但我不知道如何解決它。但我通過將備份附加到應用程序的數據庫,然後複製每個表的值來幫助我。這意味着更多的代碼,但它的工作原理。謝謝! – user2836375