私は、sqlcipher で暗号化されたデータベースを使用しているアプリに取り組んでいます。この暗号化のパスワードはキャッシュワードごとに保存されます。
データベースのバックアップを作成するために、次のコードを使用しました。
// ggf. Datenbank öffnen
openGuard();
mDb.execSQL("ATTACH DATABASE '" + outFileName + "' AS backup KEY 'asdfghjkl';");
mDb.rawExecSQL("SELECT sqlcipher_export('backup');");
mDb.execSQL("DETACH DATABASE backup;");
メソッド openGuard() を使用して、データベースがまだ開いているかどうかを確認し、開いていない場合はこれを行います。
空のキーを使用してデータベースの暗号化されていないコピーを作成し、バックアップを確認しました。次に、それを adb シェルで使用し、sql-statements を使用して必要なデータを取得できます。
長い間私の問題は、バックアップを使用してアプリのデータベースを復元できないことです。私はこのコードを試しました:
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(backupFile, "asdfghjkl", null);
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + mCacheWord.getEncryptionKey() + "';");
db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
db.rawExecSQL("DETACH DATABASE encrypted;");
あるいは、私が試した
db.execSQL("ATTACH DATABASE '" + dbFile + "' AS encrypted KEY '" + encodeRawKey(mCacheWord.getEncryptionKey()) + "';");
しかし、どちらの場合も、次のエラー メッセージが表示されます。
10-30 00:56:42.845: I/Database(14407): sqlite returned: error code = 26, msg = statement aborts at 5: [ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';] file is encrypted or is not a database
10-30 00:56:42.845: E/Database(14407): Failure 26 (file is encrypted or is not a database) on 0x63bdedb0 when executing 'ATTACH DATABASE '/data/data/.../databases/database.db' AS encrypted KEY '[B@42082da0';'
私の問題を解決してくれる人はいますか?