SQLCipher:给 SQLite 数据库加上 256 位 AES 加密

做移动端开发或者嵌入式开发的人,大概率都用过 SQLite。它轻量、快、零配置,几乎是本地存储的默认选择。但 SQLite 有个硬伤:数据库文件默认不加密。也就是说,谁拿到这个文件,拿个 SQLite 工具就能直接打开看。

SQLCipher 就是来解决这个问题的。它是 SQLite 的一个独立分支,在保留 SQLite 全部功能的基础上,给数据库文件加上了 256 位 AES 加密。7000 多 Star,算是这个细分领域里最成熟的选择。

正文顶部截图

加密怎么做

SQLCipher 的加密是在数据库文件层面做的,对上层应用透明。你用的还是标准的 SQLite API,不用改业务代码,只要在打开数据库时传一个密钥就行:

PRAGMA key = 'your-passphrase';

底层会用 PBKDF2 做密钥派生,把你的口令转换成 256 位的加密密钥。数据库文件的所有内容都会被加密,包括表名、索引、临时文件,全部是密文。

除了静态加密,SQLCipher 还支持运行时加密。你可以在程序运行过程中修改数据库密钥,不需要先导出再重新导入数据。

性能损耗有多大

这是大家最关心的问题。根据官方数据,加密操作的性能开销在 5% 到 15% 之间,具体取决于操作类型。对于绝大多数应用场景来说,这个损耗可以忽略。特别是移动应用,数据库操作本身不是瓶颈,多出来这点加密开销基本无感。

兼容性和集成

SQLCipher 保持了同主版本号内的数据库格式兼容。也就是说,用 SQLCipher 4 生成的加密数据库,可以在任何平台上的 SQLCipher 4 打开。但跨主版本需要注意,因为默认加密参数会变。

它也兼容标准的 SQLite 明文数据库。不传密钥的时候,SQLCipher 的行为和原生 SQLite 完全一致。你甚至可以把一个已有的明文 SQLite 数据库转成加密数据库,不需要重新建表导入数据。

底层加密库支持多种实现:OpenSSL、LibTomCrypt、CommonCrypto、NSS 都可以。这给了开发者很大的灵活性,特别是在不同平台的构建环境中。

README区域截图

编译和使用

编译 SQLCipher 跟编译 SQLite 差不多,多了几个编译宏需要定义。在 Unix 系统上,用 OpenSSL 作为加密库的话,configure 加上几个参数就能编译。Windows 上用 MSVC 也类似,官方文档有详细的步骤说明。

对于不想自己编译的,很多平台的包管理器已经有预编译的版本。移动端的话,iOS 和 Android 都有现成的集成方案。

什么场景适合用

手机 App 本地存储敏感数据是最典型的场景,比如聊天记录、健康数据、财务信息。其次是嵌入式设备,很多 IoT 设备用 SQLite 存数据,加上加密可以防止设备被物理接触后数据泄露。另外,任何需要遵守数据保护法规(比如 GDPR)的场景,数据库加密都是基本要求。

SQLCipher 在这些场景里已经跑了十几年,被大量商业产品验证过,稳定性和安全性都有保障。如果你在用 SQLite 并且有加密需求,它是目前最靠谱的选择。

,稳定性和安全性都有保障。如果你在用 SQLite 并且有加密需求,它是目前最靠谱的选择。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐