简单点来说, 一切使用 Cocoapods, 并且修改 Pods 源代码, 完成数据库加密需要两步:
FMDB 集成, 分为 Pods 集成, Carthage 集成, 源代码集成等三种. 本方法只针对 Pods 集成/源代码集成做了说明. Carthage 集成请参考其他两种.
Pods 集成
直接修改源代码
推荐指数: ★☆☆☆☆
- Pods 引用 FMDB/SQLCipher, 安装
- 修改 Pods 源代码中的
FMDatabase.m
中的openWithFlags:(int)flags vfs:(NSString *)vfsName
或者open
等类似的方法, 在sqlite3_open
或者sqlite3_open_v2
方法后, 添加[self setKey:@"....."]
直接使用 FMDB, 不需要修改任何东西, 数据库加密已经完成了.
子类继承
推荐指数: ★★★★★
但是, 我们在进行开发的时候通常是多个人协同开发, 大多数情况下需要提交代码到 git 上, 这时候 pods 文件就太大了, 需要忽略. 那么我们就不能够对 pods 进行修改. 这时候, 我们就需要继承子类, 实现数据库加密功能.
-
实现
FMDatabase.m
子类继承.@interface FMEncryptDatabase : FMDatabase /** 如果需要自定义encryptkey,可以调用这个方法修改(在使用之前)*/ + (void)setEncryptKey:(NSString *)encryptKey; @end static NSString *encryptKey_; @implementation FMEncryptDatabase + (void)initialize { [super initialize]; //初始化数据库加密key,在使用之前可以通过 setEncryptKey 修改 encryptKey_ = @"secret"; } #pragma mark - 重载原来方法 - (BOOL)open { if ([super open]) { //数据库open后设置加密key [self setKey:encryptKey_]; return YES; } return NO; } #if SQLITE_VERSION_NUMBER >= 3005000 - (BOOL)openWithFlags:(int)flags vfs:(NSString *)vfsName { if ([super openWithFlags:flags vfs:vfsName]) { //数据库open后设置加密key [self setKey:encryptKey_]; return YES; } return NO; } #endif #pragma mark - 配置方法 + (void)setEncryptKey:(NSString *)encryptKey { encryptKey_ = encryptKey; } @end
-
实现
FMDatabaseQueue
子类继承.@interface FMEncryptDatabaseQueue : FMDatabaseQueue @end @implementation FMEncryptDatabaseQueue + (Class)databaseClass { return [FMEncryptDatabase class]; } @end
-
在数据库打开的时候, 使用
FMEncryptDatabaseQueue
替代FMDatabaseQueue
, 这时候就实现了加密过程.
源代码集成
关于使用 FMDB 的方式与上面 Pods 集成的方式一样. 这里详述如何添加 SQLCipher.
由于使用 FMDB 的时候, Cocoapods 帮我们自己添加了依赖. 那么我们自己实现的时候, 就需要自己添加对应的依赖.
- FMDB 源代码拷贝到工程中.
- 编译 OpenSSL 与 SQLCipher 代码, 生成 crypto.a 与 sqlcipher.a 文件.(我们这里统统使用静态库, 当然, 你可以使用动态库.)
- 引用静态库 sqlcipher.a 与 crypto.a, 编译代码.
- 参考上面 Pods 集成的方式, 修改 FMDB 支持加密数据库.
这时候加密就完成了.
网友评论