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