使用SQLCipher加密SQLite数据库

在iOS应用程序开发中经常需要使用SQLite来存储数据,很多时候需要加密保存一部分的数据。常见的做法是将要存储的内容先加密然后存到数据库中,使用的时候将数据进行解密,这样就会有大量的性能消耗在数据的加解密上(性能主要取决于加解密的算法和CPU的能力)。
SQLCipher is an open source extension to SQLite that provides transparent 256-bit AES encryption of database files.

SQLite本身是支持加密功能的(免费版本不提供加密功能,商业版本是支持加密模块)。SQLCipher是一个开源的SQLite加密扩展,支持对db文件进行256位的AES加密。
集成SQLCipher
集成SQLCipher有有两种方法一种是按照官方的方式一步步的执行,这里就不过多的介绍。配置过程很麻烦,推荐使用下面的方式集成。
1、获取SQLite加密模块(SQLCipher)
在终端(Terminal)中使用pod search FMDB
,在查询的结果中可以看到有个FMDB/SQLCipher
的Sub spec。

sqlcipher-search-fmdb.png

如果使用FMDB和CocoaPods的话直接在你的Podfile中添加pod 'FMDB/SQLCipher'

sqlcipher-podfile.png

如果没有使用CocoaPods的话建议还是安装一个吧,或者是新建一个测试项目安装FMDB和SQLCipher。安装CocoaPods可以参考《使用CocoaPods管理iOS项目中的依赖库》
2、导入SQLCipher
执行pod install
之后会自动获取SQLCipher,其实SQLCipher只有两个文件sqlite3.h
和sqlite3.m

拷贝sqlite3.h/sqlite3.m文件到项目中,如果使用CocoaPods方式获取SQLCipher的话,这一步骤就不需要了。
3、配置Xcode设置项
通过查询资料SQLite是否开启加密模块是通过宏(SQLITE_HAS_CODEC
)来配置的。那么就需要在Xcode中配置开启SQLite加密组件的宏(如使用CocoaPods方式则不需要配置)。
sqlite-extension-marco.png

(1)target -> Build Setting -> Other C Flags添加-DSQLITE_HAS_CODEC、-DSQLITE_TEMP_STORE=2、-DSQLITE_THREADSAFE、-DSQLCIPHER_CRYPTO_CC几项配置
(2)target -> Build Setting -> Other Linker Flags添加-framework Security配置
4、如何使用
(1)引入sqlite3加密模块,然后在打开数据库之后加入如下代码
const char *key = [@"devzeng" UTF8String];sqlite3_key(_db, key, (int)strlen(key));

如下图:

sqlcipher-sqlite3-open.png

说明:
1)如果没有添加-DSQLITE_HAS_CODEC配置上面的代码会报错
2)sqlite3_key函数需要指定加密使用的key,推荐使用UUID(可以进行salt处理)并存储到KeyChain中。
3)如使用FMDB,可以在FMDB的open方法之后添加上面的两行代码。
(2)使用了加密模块在提交到App Store时需要指明,具体的操作方法可以参考StackOverflow上面的做法。Does my application “contain encryption”?
参考资料
1、《Adding SQLCipher to Xcode Projects》
2、《ios开发FMDB导入SQLCipher加密数据库》
3、《SQLite数据库加密研究》

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据库加密一般有两种方式 1、对所有数据进行加密 2、对数据库文件加密 对比以上两种方式,第一种方式的常见做法是是...
    肉肉要次肉阅读 3,537评论 0 1
  • 介绍: 使用SQLite数据库的时候,有时候对于数据库要求比较高,特别是在iOS8.3之前,未越狱的系统也可以通过...
    farawei阅读 5,082评论 2 51
  • 在iOS开发过程中经常需要用到SQLite来存储数据,由于Apple的沙盒机制,我们App的数据存储在沙盒里面,...
    伍骁辛阅读 4,442评论 8 15
  • 这篇文章介绍如何对数据库文件进行加密,基于FMDB+SQLCipher,标明踩过的坑,留给同样掉进坑里的小伙伴参考...
    7544eb39c4ac阅读 6,618评论 3 28
  • 北京梦之翼传统文化家塾 学子今日成长的力量 : 1,郝泽迎同学进...
    梦之翼教育的简书阅读 114评论 0 0