1

嘿伙计们,我在使用 SQLcipher db for android 时遇到了一些问题,文档描述性不太强,所以我无法弄清楚。

我正在尝试修改 sqlcipher for android 的默认迭代次数,我正在编辑作为演示应用程序提供的 notecipher 应用程序,并希望将 kdf_iter 增加到 5000

通过覆盖数据库帮助程序中的 getWritableDatabase() 方法,我在使用密码打开文件后输入编译指示值。

我可以打开并初始化数据库,但如果我调用 database.close(),我将无法重新打开数据库。

每当我在下一次 open() 调用中关闭数据库时,我都会得到:

I/Database(807): sqlite returned: error code = 26, msg = file is encrypted or is not a database
E/Database(807): CREATE TABLE android_metadata failed
E/Database(807): Failed to setLocale() when constructing, closing the database
E/Database(807): info.guardianproject.database.sqlcipher.SQLiteException: file is encrypted or is not a database
4

2 回答 2

2

You'll want to use a SQLiteDatabaseHook object to call the kdf_iter pragma. This will ensure that the pragma is called immediately after the database is opened, but before it is used.

SQLiteDatabaseHook hook = new SQLiteDatabaseHook(){
  public void preKey(SQLiteDatabase database){
    database.rawExecSQL("PRAGMA kdf_iter = 5000");
  }
  public void postKey(SQLiteDatabase database){}
}

SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databasePath, password, null, hook);
于 2012-11-25T18:19:27.230 回答
1

@Stephen 的回答只是部分正确,因为根据文档

PRAGMA kdf_iter 必须PRAGMA 键之后和第一次实际数据库操作之前调用,否则它将不起作用。

所以这一行:

database.rawExecSQL("PRAGMA kdf_iter = 5000");

必须插入 postKey() 方法,而不是 preKey()。
这对我有用。

于 2015-11-09T14:32:14.777 回答