Android SQLCipher RC4加密数据库文件“文件已加密或不是数据库”

时间:2014-02-26 17:04:14

标签: android android-sqlite sqlcipher

我有一个使用System.Data.SQLite从现有应用程序导出的encyprted SQLite数据库文件。基于我能找到的,System.Data.SQLite使用128位RC4加密。

当我尝试使用SQLCipher在我的Android应用程序中加载此数据库时,出现以下错误“文件已加密或不是数据库”。我已经尝试使用数据库钩子设置pragma key = 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());
    }

关于我做错的任何想法?

2 个答案:

答案 0 :(得分:0)

看起来我在SQLCipher Google Group上找到了答案:

  

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

     

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

答案 1 :(得分:0)

您的数据库可能是旧版本的SQLCipher版本,而不是您尝试打开它的版本。

尝试在打开并设置数据库密钥后立即执行查询PRAGMA cipher_migrate;