SQLCipher Android, set key for not encrypted DB

Я пытаюсь запустить SQLCipherexist DB, который не зашифрован.

Метод, который я использую, кажется, работает, но не шифруется так же, как SQLCipher.

public static synchronized SQLiteDatabase openDatabase() {
        try {
            return sDatabaseHelper.getWritableDatabase(KEY);
        } catch (Exception e) {
            android.database.sqlite.SQLiteDatabase sqLiteDatabase = android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(
                    sContext.getDatabasePath(mConfiguration.getDatabaseName()), null);
            sqLiteDatabase.execSQL(String.format("PRAGMA key = '%s'", KEY));
            return sDatabaseHelper.getWritableDatabase(KEY);
        }
    }

P. S работает на заказ ActiveAndroid

Есть ли какое-то решение?

1 ответ

  1. Нашел решение, и принял его для ActiveAndroid

    public static synchronized SQLiteDatabase openDatabase() {
            try {
                return sDatabaseHelper.getWritableDatabase(KEY);
            } catch (Exception e) {
                try {
                    encrypt(getContext(), sDatabaseHelper.getConfiguration().getDatabaseName(), KEY);
                    return sDatabaseHelper.getWritableDatabase(KEY);
                } catch (IOException e1) {
                    e1.printStackTrace();
                    return null;
                }
            }
        }
    
        public static void encrypt(Context ctxt, String dbName, String passphrase) throws IOException {
            File originalFile = ctxt.getDatabasePath(dbName);
    
            if (originalFile.exists()) {
                File newFile = File.createTempFile("sqlcipherutils", "tmp", ctxt.getCacheDir());
                SQLiteDatabase db = SQLiteDatabase.openDatabase(originalFile.getAbsolutePath(), "", null,
                        SQLiteDatabase.OPEN_READWRITE);
                db.rawExecSQL(String.format("ATTACH DATABASE '%s' AS encrypted KEY '%s';",
                        newFile.getAbsolutePath(), passphrase));
                db.rawExecSQL("SELECT sqlcipher_export('encrypted')");
                db.rawExecSQL("DETACH DATABASE encrypted;");
                int version = db.getVersion();
                db.close();
                db = SQLiteDatabase.openDatabase(newFile.getAbsolutePath(), passphrase, null,
                        SQLiteDatabase.OPEN_READWRITE);
                db.setVersion(version);
                db.close();
    
                originalFile.delete();
                newFile.renameTo(originalFile);
            }
        }