FMDB/SQLCipher数据库加解密

sqlite应用几乎在所有的App都能看到,虽然我们的数据存储在沙盒里面,一般情况下无法拿到,但是iOS管理软件(如:iFunBox)可以读取到应用程序沙盒里面的文件,为了提高数据的安全性,我们需要考虑对数据库进行加密

数据库加密一般有两种方式

1、对所有数据进行加密

2、对数据库文件加密

处于客户端性能的考虑,通常我们对数据库文件进行加密,在iOS上用的比较多的是 sqlcipher,由于原生提供的sqlite API是C语言实现的,通常我们会用一个在github上比较有名的一个工具库FMDB,FMDB对原生的sqlite进行了封装,提供了面向对象的方式对数据库操作,同时FMDB 也提供了对 sqlcipher 的支持

下面基于 FMDB 和 sqlcipher 演示数据库加解密

编译sqlcipher需要做一些配置,具体配置详情见:https://www.zetetic.net/sqlcipher/ios-tutorial/

我们通过 cocoapod 引用 FMDB 和sqlcipher 我们可以直接拿到编译好的.a文件,直接用就可以

1、通过cocoapod 引用库

pod 'FMDB/SQLCipher', '~> 2.5'

如果项目已经引用了FMDB,改为FMDB/SQLCipher 重新install一次即可,通过cocoapod添加的FMDB默认还是没有加密的,要使用加密的功能,需要在数据库open后调用setKey方法设置key,如下:

FMDB/SQLCipher数据库加解密_第1张图片

关键代码:[self setKey:encryptKey_];

2、添加数据库加密操作类

上面代码是FMDatabase中的,CocoaPod添加的库不推荐修改,修改后不利于类库的统一管理和更新

有些人则不用cocoapod引用FMDB,而是直接把FMDB的源文件拷贝到项目中,然后进行修改,我更倾向与保留cocoapod对FMDB的管理,通过新增类提供对数据库加密的支持,这里新增两个类:FMEncryptDatabase 和 FMEncryptDatabaseQueue

我们可以重用 FMDatabase 和 FMDatabaseQueue 的逻辑,所以我们可以继承自他们,同时我再FMEncryptDatabase 中提供两个数据库迁移的方法,可以把未加密的数据库转换为加密的数据库,也可以反向转换

由于secretKey一般只需要一份,所以这里使用一个静态变量实现,如果需要修改,可以在AppDelegate的 application:didFinishLaunchingWithOptions: 方法进行设置:

FMDB/SQLCipher数据库加解密_第2张图片
FMEncryptDatabase.h
FMDB/SQLCipher数据库加解密_第3张图片
FMEncryptDatabase.m
FMDB/SQLCipher数据库加解密_第4张图片
FMEncryptDatabase.m
FMDB/SQLCipher数据库加解密_第5张图片
FMEncryptHelper.h
FMDB/SQLCipher数据库加解密_第6张图片
FMEncryptHelper.m
FMDB/SQLCipher数据库加解密_第7张图片
FMEncryptHelper.m
FMDB/SQLCipher数据库加解密_第8张图片
FMEncryptHelper.m

3、测试

好了,通过上面两个类创建的数据库都是加密过的,下面做一些测试,具体代码见后面的demo:

FMDB/SQLCipher数据库加解密_第9张图片
demo虚拟机运行

4、Demo

demo地址:github.com/fenglinyunshi/FmdbDemo

你可能感兴趣的:(FMDB/SQLCipher数据库加解密)