文档章节

使用FMDB加密数据库的错误尝试

hell03W
 hell03W
发布于 2016/11/03 17:07
字数 430
阅读 72
收藏 0

在公司产品上线前, 准备把数据库加密掉, 本来是几行代码的事情, 倒腾了几个小时......

1. 加密操作

网上大多数方法的做法是, 直接修改FMDatabase.h方法, 我认为直接修改第三方库的源码, 是不科学的, 我的做法是创建新类, 继承自FMDatabase, 重写相应的方法, 在需要加密的地方, 添加加密用的语句.

2. 错误方式

原来项目中已经通过cocoapod集成了FMDB 框架. 刚开始我的做法是, 在Profile上直接加上pod 'FMDB/SQLCipher' #数据库加密, 这时候Profile中同时包含 pod 'FMDB' #数据库`` pod 'FMDB/SQLCipher', 安装之后, 不管怎么测试, 总是无法读写数据库, 耗了好长时间, 最终发现, 删除 ``pod 'FMDB'` 之后, 就可以正常读写了......

cocoapod集成SQLCipher时候, Profile加入 'FMDB/SQLCipher' 即可!!

3. 为了实现加密重写的方法

#pragma mark - 对FMDataBase加密, 使用 SQLCipher, 通过重载方法 实现加密
#import "sqlite3.h"

@implementation FMCipherDataBase

static NSString *DB_SECRETKEY = @"123456";


+ (instancetype)databaseWithPath:(NSString *)inPath cipherKey:(NSString *)cipherKey {
    
    FMCipherDataBase *database = [super databaseWithPath:inPath];
    DB_SECRETKEY = cipherKey;
    return database;
}

- (const char*)sqlitePath {
    
    if (!_databasePath) {
        return ":memory:";
    }
    
    if ([_databasePath length] == 0) {
        return ""; // this creates a temporary database (it's an sqlite thing).
    }
    
    return [_databasePath fileSystemRepresentation];
    
}

- (BOOL)open {
    if (_db) {
        return YES;
    }
    
    int err = sqlite3_open([self sqlitePath], (sqlite3**)&_db );
    if(err != SQLITE_OK) {
        NSLog(@"error opening!: %d", err);
        return NO;
    } else {
        
        [self setKey:DB_SECRETKEY];
    }
    
    if (_maxBusyRetryTimeInterval > 0.0) {
        // set the handler
        [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];
    }
    
    
    return YES;
}

- (BOOL)openWithFlags:(int)flags vfs:(NSString *)vfsName {
#if SQLITE_VERSION_NUMBER >= 3005000
    if (_db) {
        return YES;
    }
    
    int err = sqlite3_open_v2([self sqlitePath], (sqlite3**)&_db, flags, [vfsName UTF8String]);
    if(err != SQLITE_OK) {
        NSLog(@"error opening!: %d", err);
        return NO;
    } else {
        
        [self setKey:DB_SECRETKEY];
    }
    
    if (_maxBusyRetryTimeInterval > 0.0) {
        // set the handler
        [self setMaxBusyRetryTimeInterval:_maxBusyRetryTimeInterval];
    }
    
    return YES;
#else
    NSLog(@"openWithFlags requires SQLite 3.5");
    return NO;
#endif
}

@end

详情请参考: https://github.com/hell03W/FMDBHelper

© 著作权归作者所有

hell03W
粉丝 9
博文 145
码字总数 109892
作品 0
朝阳
程序员
私信 提问
基于FMDB数据库操作类--LKFMDB

LKFMDB是一种数据库操作类。可对FMDB面向对象封装,支持任意类型主键,可对每个字段修饰,傻瓜式操作,一键即可保存更新。 支持SQLCipher加密(见 demo): 默认为加密模式 如需要取消在fmdb文件...

匿名
2016/03/22
1K
0
转自:http://blog.devtang.com/blog/2012/04/22/use-fmd

1234567891011 可以看到,使用FMDB后的数据库代码清晰明了,比原生的API优雅多了。另外,FMDB同时兼容ARC和非ARC工程,会自动根据工程配置来调整相关的内存管理代码。 使用说明 该使用说明主...

W浪琴B
2016/05/25
27
0
iOS - 数据库 第三方框架FMDB

初识FMDB iOS中原生的 API在进行数据存储的时候,需要使用C语言中的函数,操作比较麻烦。于是,就出现了一系列将SQLite API进行封装的库,例如、、等。 FMDB是一款简洁、易用的封装库。因此,...

linweida
2016/09/20
23
0
基于Xcode8.x的CoreData的使用

首先说说对于CoreData的理解,类似于FMDB。他能将数据库中的列表转换成模型实体对象,方便开发者使用。同时,也能将一个将实体对象转换成数据库中的表,存储到数据库中。这就是CoreData,数据...

最牛逼的代码搬运工
2016/12/07
205
0
Realm、WCDB与SQLite移动数据库性能对比测试

一、数据库介绍 SQLite 3 比较常见不予赘述。 Realm 是由Y Combinator孵化的创业团队开源出来的一款可以用于iOS(同样适用于Swift&Objective-C)和Android的跨平台移动数据库。目前最新版是Rea...

cloudox_
2017/07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 脚本引擎入门

Java Script Engine Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期还可能会换...

阿提说说
46分钟前
5
0
05.深入浅出索引(下)

在下面这个表T中,如果我们执行select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? mysql> create table T ( id int primary key, k int not null default...

scgaopan
昨天
6
0
设计模式-中介者模式

设计模式-中介者模式 定义 用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互 UML 组成部分主要包含 Mediat...

木本本
昨天
5
0
Python 周刊第 418 期

新闻 PyCon US 2020 开始接受财务赞助! https://pycon.blogspot.com/2019/10/financial-aid-launches-for-pycon-us-2020.html2020年 Python 美国开发者大会,tips: 中国也有,可以赞助国内的...

iCodeBugs
昨天
5
0
ThreadLocal源码阅读

首先,从set方法入手, // ThreadLocalpublic void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t);//这里可以看出,从Threa......

小海bug
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部