FMDB 使用 SQLCipher 对数据库进行加密

简单点来说, 一切使用 Cocoapods, 并且修改 Pods 源代码, 完成数据库加密需要两步:

FMDB 集成, 分为 Pods 集成, Carthage 集成, 源代码集成等三种. 本方法只针对 Pods 集成/源代码集成做了说明. Carthage 集成请参考其他两种.

Pods 集成

直接修改源代码

推荐指数: ★☆☆☆☆

  1. Pods 引用 FMDB/SQLCipher, 安装
  2. 修改 Pods 源代码中的 FMDatabase.m 中的 openWithFlags:(int)flags vfs:(NSString *)vfsName 或者 open 等类似的方法, 在 sqlite3_open 或者 sqlite3_open_v2 方法后, 添加 [self setKey:@"....."]

直接使用 FMDB, 不需要修改任何东西, 数据库加密已经完成了.

子类继承

推荐指数: ★★★★★

但是, 我们在进行开发的时候通常是多个人协同开发, 大多数情况下需要提交代码到 git 上, 这时候 pods 文件就太大了, 需要忽略. 那么我们就不能够对 pods 进行修改. 这时候, 我们就需要继承子类, 实现数据库加密功能.

  1. 实现 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
    
    
  2. 实现 FMDatabaseQueue 子类继承.

    @interface FMEncryptDatabaseQueue : FMDatabaseQueue
    @end
    
    @implementation FMEncryptDatabaseQueue
    + (Class)databaseClass {
        return [FMEncryptDatabase class];
    }
    @end
    
  3. 在数据库打开的时候, 使用 FMEncryptDatabaseQueue 替代 FMDatabaseQueue, 这时候就实现了加密过程.

源代码集成

关于使用 FMDB 的方式与上面 Pods 集成的方式一样. 这里详述如何添加 SQLCipher.

由于使用 FMDB 的时候, Cocoapods 帮我们自己添加了依赖. 那么我们自己实现的时候, 就需要自己添加对应的依赖.

  1. FMDB 源代码拷贝到工程中.
  2. 编译 OpenSSL 与 SQLCipher 代码, 生成 crypto.a 与 sqlcipher.a 文件.(我们这里统统使用静态库, 当然, 你可以使用动态库.)
  3. 引用静态库 sqlcipher.a 与 crypto.a, 编译代码.
  4. 参考上面 Pods 集成的方式, 修改 FMDB 支持加密数据库.

这时候加密就完成了.

你可能感兴趣的:(FMDB 使用 SQLCipher 对数据库进行加密)