2014-02-27 81 views
2

我使用sqlcipher版本3.7.17和sqlite3版本3.7.15.2在ubuntu終端中加密sqlite數據庫。當我嘗試在android中使用這個加密的數據庫時,我收到錯誤「文件已加密或不是數據庫」。我在android中使用sqlcipher版本2.2.0。在Ubuntu終端使用「文件被加密或不是數據庫」當嘗試解密加密數據庫時出現錯誤android

加密代碼:
./sqlcipher plaintext.db
源碼> ATTACH DATABASE 'encrypted.db' AS加密KEY '密押';
sqlite> SELECT sqlcipher_export('encrypted');
sqlite> DETACH DATABASE encrypted;

Android的代碼解密:
SQLiteDatabase數據庫= SQLiteDatabase.openOrCreateDatabase(databaseFile,密押」,NULL);

任何幫助,將不勝感激!!

+0

我無法幫助你解決問題,如果你發佈了一些代碼,它可以幫助那些可以幫助你的人。 –

+0

恩,有SQLCipher 3.7.17 AFAIK。最新的是3.0.2。 – CommonsWare

回答

2

如果您正在使用SQLCipher核心3.7 .17,這是對應於SQLCipher的v2.2.1標記的SQLite版本字符串,它可以與適用於Android 2.2.0的SQLCipher正常工作。要驗證您的初始加密是否正常工作,請按照sqlcipher_export過程執行以下操作:

$> ./sqlcipher encrypted.db 
sqlite> PRAGMA key = 'testkey'; 
sqlite> select * from sqlite_master; 

如果你從sqlite_master表的查詢顯示的結果,我們應該排除的應用集成的問題,你可以試試SQLCipher內運行數據庫爲Android test suite?請注意,測試套件針對Android庫的最新SQLCipher,目前爲3.0.2,並且將需要使用不同的密鑰派生長度; 4000是SQLCipher 2.x中的默認值。你會希望你的數據庫文件複製到assets目錄,然後嘗試使用下面的示例中打開它:

SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){ 
    public void preKey(SQLiteDatabase database){} 
    public void postKey(SQLiteDatabase database){ 
    database.execSQL("PRAGMA kdf_iter = 4000;"); 
}; 
ZeteticApplication.getInstance().extractAssetToDatabaseDirectory("encrypted.db"); 
File databaseFile = ZeteticApplication.getInstance().getDatabasePath("encrypted.db"); 
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, "testkey", 
                   null, hook); 

從那裏,你應該能夠查詢數據庫。如果您有特別的問題,SQLCipher Mailing List也是一個很好的開始。

+0

感謝Nick的回覆。我嘗試了Android測試套件和SQLiteDatabaseHook,但仍然得到相同的錯誤。我想解密一個已經在Ubuntu終端中使用sqlcipher版本3.7.17和sqlite3版本3.7.15.2加密的android數據庫 –

相關問題