将数据库从SQLite更改为SQLCipher后,升级应用程序时遇到问题

时间:2019-08-12 08:18:30

标签: sqlite android-sqlite sqlcipher android-database sqlcipher-android

我们以前有一个移动应用程序在使用 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) .....

1 个答案:

答案 0 :(得分:0)

  

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。相反,   应用程序应在cipher_migrate中使用推荐的过程   API文档。

     

注意: 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设置键之前的进程生存期的值   操作被调用。

您可以找到详细信息here