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,如下

- (BOOL)open {    if (_db) {        return YES;
    }    
    int err = sqlite3_open([self sqlitePath], &_db );    if(err != SQLITE_OK) {
        NSLog(@"error opening!: %d", err);        return NO;
    } else {        //数据库open后设置加密key        [self setKey:encryptKey_];
    }    
    if (_maxBusyRetryTimeInterval > 0.0) {        // set the handler        [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];
    }    
    return YES;
}

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

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

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

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

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

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

 FMEncryptDatabase

 FMEncryptDatabaseQueue

 

 FMEncryptHelper

 

3、测试

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

 

   加密后的数据库暂时没有找到可以打开的GUI工具查看(MesaSQLite),即使输入secretKey也无法查看,不知道为何

 

4、常见问题问题

  如果你不是通过Cocoapod的方式引用的Fmdb和Sqlcipher,可以直接在https://github.com/sqlcipher/sqlcipher 下载到sqlcipher的工程文件,然后应用到项目中,并且需要在你的项目中添加-DSQLITE_HAS_CODEC 宏定义,否则使用Fmdb的时候将不会加密

 

 

5、Demo

  http://files.cnblogs.com/files/bomo/FmdbEncryptDemo.zip
















本文转自ljianbing51CTO博客,原文链接:http://blog.51cto.com/ljianbing/1903080 ,如需转载请自行联系原作者


相关文章
|
3月前
|
关系型数据库 MySQL 数据库连接
gorm连接mysql数据库以及建表和自动迁移
gorm连接mysql数据库以及建表和自动迁移
35 0
|
4月前
|
SQL 数据库 Python
记Flask-Migrate迁移数据库失败的两个Bug——详解循环导入问题
Flask-Migrate迁移数据库失败的两个Bug 1、找不到数据库:Unknown database ‘***’ 若还没有创建数据库,该迁移工具不会自动创建。你可以使用SQL命令手动创建一个数据库:
37 0
|
9月前
|
数据可视化 关系型数据库 MySQL
将 PostgreSQL 迁移到 MySQL 数据库
将 PostgreSQL 迁移到 MySQL 数据库
1048 2
|
4月前
|
关系型数据库 数据库 RDS
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
如果源数据库和目标数据库中都存在sequence的column且在迁移过程中没有新增的话
30 1
|
27天前
|
SQL 数据可视化 Apache
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
阿里云数据库 SelectDB 内核 Doris 的 SQL 方言转换工具, Doris SQL Convertor 致力于提供高效、稳定的 SQL 迁移解决方案,满足用户多样化的业务需求。兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移。
阿里云数据库内核 Apache Doris 兼容 Presto、Trino、ClickHouse、Hive 等近十种 SQL 方言,助力业务平滑迁移
|
2月前
|
存储 关系型数据库 数据库
在进行RDS(Amazon Relational Database Service,亚马逊关系数据库服务)迁移时,兼容性审查
在进行RDS(Amazon Relational Database Service,亚马逊关系数据库服务)迁移时,兼容性审查
20 1
|
3月前
|
存储 安全 关系型数据库
云数据库和传统数据库之间的迁移和集成有哪些挑战?
云数据库和传统数据库之间的迁移和集成有哪些挑战?
33 0
|
4月前
|
关系型数据库 数据库 RDS
为了确保数据的完整性和准确性,建议您在进行数据迁移前,充分理解源数据库和目标数据库的特性以及迁移过程中可能出现的问题
为了确保数据的完整性和准确性,建议您在进行数据迁移前,充分理解源数据库和目标数据库的特性以及迁移过程中可能出现的问题
40 1
|
4月前
|
SQL 关系型数据库 MySQL
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
97 0
|
4月前
|
存储 SQL NoSQL
案例实践:某券商从 Neo4j 迁移至悦数图数据库
许多国内企业在早期使用 Neo4j 作为图相关业务场景的探索基础设施。然而,随着业务发展和环境变化,原有的图数据库已经逐渐无法满足不断发展的特定业务场景需求。如何将 Neo4j 迁移到一款兼具良好扩展性、性能、专业服务能力的图产品,已成为业界普遍关心的问题。本文将为您呈现华东某大型券商从 Neo4j 迁移至悦数图数据库的选型、迁移和提升能力的完整历程,供广大企业参考。
案例实践:某券商从 Neo4j 迁移至悦数图数据库