我有一个使用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());
}
关于我做错的任何想法?
答案 0 :(得分:0)
看起来我在SQLCipher Google Group上找到了答案:
如果你的SQLite数据库是在SQLCipher之外加密的,你会的 首先需要将该数据库导出到纯文本SQLite数据库。 完成后,您可以使用sqlcipher_export方便 函数创建一个SQLCipher加密版本的纯文本 数据库。请参阅文档中的示例1 1 您的方案的sqlcipher_export。
答案 1 :(得分:0)
您的数据库可能是旧版本的SQLCipher版本,而不是您尝试打开它的版本。
尝试在打开并设置数据库密钥后立即执行查询PRAGMA cipher_migrate;
。