Столкнулся с проблемой при обновлении приложения после смены базы данных с SQLite на SQLCipher

У нас есть мобильное приложение, в котором раньше использовалось SQLite, но из соображений безопасности мы изменили его на SQLCipher, чтобы обеспечить шифрование. Но когда я пытаюсь установить приложение для первый раз работает нормально, проблема в том, что когда я пытаюсь обновить приложение. Приложение аварийно завершает работу с приведенной ниже stacktrace

Caused by: net.sqlcipher.database.SQLiteException: file is not a database: , while compiling: select count(*) from sqlite_master;
        at net.sqlcipher.database.SQLiteCompiledSql.native_compile(Native Method) .....

person Amith    schedule 12.08.2019    source источник
comment
Вы уже проверили discuss.zetetic.net/t/upgrading-to- sqlcipher-4/3283   -  person Sazzad Hissain Khan    schedule 12.12.2019


Ответы (1)


В последнем выпуске SQLCipher 4 представлено множество новых улучшений производительности и безопасности для приложений, использующих SQLCipher для безопасного локального хранения данных. Однако введение новых алгоритмов по умолчанию, увеличение числа итераций KDF и увеличение размера страницы означают, что SQLCipher 4 не будет открывать старые базы данных по умолчанию.

В этом документе представлены рекомендации по вариантам обновления, доступным для приложений, в которые ранее были интегрированы SQLCipher версий с 1 по 3.

Вариант 1. Миграция файла базы данных

SQLCipher предоставляет очень удобный способ выполнить миграцию базы данных SQLCipher "на месте" с помощью PRAGMA cipher_migrate.. При этом вся работа по обновлению формата файла базы данных выполняется с помощью одного оператора SQL. После миграции база данных будет использовать все последние настройки по умолчанию, поэтому приложение сразу же сможет воспользоваться улучшенной производительностью и безопасностью.

PRAGMA cipher_migrate запускать один раз сразу после предоставления ключа (т. е. через sqlite3_key() или PRAGMA key для обновления базы данных. Обычно это происходит при первом запуске после обновления приложения для выполнения одноразового диалога.

После завершения миграции приложению больше не нужно будет снова вызывать команду при последующих открытиях.

PRAGMA key = '<key material>';
PRAGMA cipher_migrate;

PRAGMA вернет одну строку со значением 0 после успешного завершения процесса миграции. В случае сбоя миграции будет возвращено ненулевое значение столбца. В случае успеха перенесенная база данных останется открытой и будет использовать то же имя файла.

Важно! cipher_migrate PRAGMA потенциально затратен, поскольку ему необходимо пытаться открыть базу данных для каждой версии, чтобы определить соответствующие параметры. Поэтому приложение НЕ должно вызывать PRAGMA каждый раз, когда открывается база данных. Вместо этого приложение должно использовать процесс, рекомендованный в документации API cipher_migrate.

Примечание. SQLCipher для пользователей Android Java: при открытии подключения к базе данных для запуска PRAGMA cipher_migrate необходимо включить флаг SQLITE_OPEN_CREATE, так как в процессе миграции будет временно присоединена новая база данных.

Вариант 2: обратная совместимость

Второй вариант — использовать новую библиотеку SQLCipher 4, но использовать все настройки SQLCipher 3 (или более ранней версии). Это требует, чтобы приложение выполняло операторы PRAGMA сразу после ввода базы данных, которая будет соответствовать параметрам, первоначально использованным для создания базы данных.

Начиная с SQLCipher 4.0.1 вы можете использовать новую функцию cipher_compatibility. Передача значений 1, 2 или 3 в PRAGMA приведет к тому, что SQLCipher будет работать с настройками по умолчанию, соответствующими соответствующему основному номеру версии для текущего соединения. Например, следующее заставит SQLCipher рассматривать текущую базу данных как базу данных SQLCipher 3.x:

PRAGMA cipher_compatibility = 3;

Также можно использовать аналогичную совместимость cipher_default PRAGMA, чтобы установить значение времени жизни процесса до вызова ключевых операций.

Вы можете найти подробности здесь.

person Sazzad Hissain Khan    schedule 12.12.2019
comment
где прагма принадлежит? Я попытался выполнить его первым делом, и моя база данных не работает (не база данных), но если я использую cipher_default_compatibility, она работает в том же идентичном месте. - person Michael; 12.06.2021