曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

使用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.hsqlite3.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数据库加密研究》

最近的文章

在iOS9中使用CoreSpotlight

在iOS9之前,用户可以通过Spotlight中输入关键字来查找App。在iOS9中Apple随之发布了一套全新的iOS9 Search APIs之后,开发者不但可以自由的将App的部分内容建立索引,还能对Spotlight上的搜索结果以及点击不同的结果显示的内容进行设置。###三种搜索的API简介####NSUserActivityNSUserActivity是iOS8专为Handoff推出的API,在iOS9得到了提升。现在用户只需要提供元数据(metadata)就能搜索到不同的活动(...…

iOS继续阅读
更早的文章

iOS中Realm数据库的基本用法

Realm是由Y Combinator公司孵化的一款支持运行在手机、平板和可穿戴设备上的嵌入式数据库(旨在取代CoreData和Sqlite)。Realm并不是对Core Data的简单封装,相反地,Realm并不是基于Core Data,也不是基于SQLite所构建的。它拥有自己的数据库存储引擎,可以高效且快速地完成数据库的构建操作。Realm可以轻松地移植到项目当中,并且绝大部分常用的功能(比如说插入、查询等等)都可以用一行简单的代码轻松完成!目前支持Objective-C、Swift...…

iOS继续阅读