美文网首页iOS开发之常用技术点
FMDB 使用 SQLCipher 对数据库进行加密

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

作者: l蓝色梦幻 | 来源:发表于2018-11-21 09:59 被阅读128次

    简单点来说, 一切使用 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 对数据库进行加密

        本文链接:https://www.haomeiwen.com/subject/afsqqqtx.html