在iOS开发过程中经常需要用到SQLite来存储数据,由于Apple的沙盒机制,我们App的数据存储在沙盒里面,一般情况下无法拿到数据,但是iOS管理软件iFunBox可以读取到应用程序沙盒里面的文件,因此为了保证数据的安全性,我们需要对数据库进行加密存储,然而,一般的加密存储手段有两种方式:
1、对数据库中的每条数据进行加密。
2、对数据库整个进行加密。
由于前者较为麻烦,储存和取出是需要进行加解密操作,过程非常繁琐。所以建议采用第二种加密手段,即对整个数据库进行加密。在IOS中,我们经常使用第三方数据库FMDB来简化直接对sqlite的操作,因为FMDB是基于sqlite的oc层封装。然后sqlite并不直接支持对数据库的加密,需要借助第三方工具来sqlcipher来实现。并且FMDB已经提供了sqlcipher的拓展。
1.Sqlcipher导入方式
a.Pod导入,比较推荐
pod 'FMDB/SQLCipher'
b.手动导入
在导入FMDB的基础上,把Sqlcipher提供的sqlite3.c、sqlite3.h替换掉。
手动修改配置
(1)target -> Build Setting -> Other C Flags添加
-DSQLITE_HAS_CODEC、
-DSQLITE_TEMP_STORE=2、
-DSQLITE_THREADSAFE、
-DSQLCIPHER_CRYPTO_CC
几项配置
(2)target -> Build Setting -> Other Linker Flags添加-framework Security配置
然后新建子类FMEncryptDatabase继承于FMDatabase用于设置数据库key,重写open和openWithFlags方法,对于加密的数据库,每次的打开之后都必须使用密码,即设置数据库key.
#import "FMDatabase.h"
@interface FMEncryptDatabase : FMDatabase
/** 如果需要自定义encryptkey,可以调用这个方法修改(在使用之前)*/
+ (void)setEncryptKey:(NSString *)encryptKey;
@end
#import "FMEncryptDatabase.h"
@implementation FMEncryptDatabase
static NSString *encryptKey_;
+ (void)initialize
{
[super initialize];
//初始化数据库加密key,在使用之前可以通过 setEncryptKey 修改
encryptKey_ = @"FDLSAFJEIOQJR34JRI4JIGR93209T489FR";
}
#pragma mark - 重载原来方法
- (BOOL)open {
if (_db) {
return YES;
}
int err = sqlite3_open([self sqlitePath], &_db );
if(err != SQLITE_OK) {
NSLog(@"error opening!: %d", err);
return NO;
} e