1

やあみんな私はアンドロイド用のSQLcipherdbでいくつかの問題を抱えていますドキュメントはあまり説明的ではないので私はそれを理解することができませんでした。

sqlcipher for androidのデフォルトの反復回数を変更しようとしています。デモアプリとして提供されているnotecipherアプリをsqlcipherで編集しており、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

SQLiteDatabaseHookオブジェクトを使用して、kdf_iterプラグマを呼び出す必要があります。これにより、データベースが開かれた直後で、使用される前にプラグマが呼び出されるようになります。

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");

preKey()ではなく、postKey()メソッドに挿入する必要があります。
これは私のために働いた。

于 2015-11-09T14:32:14.777 に答える