背景:公司安全部做信息檢查時(shí)掃描到沙盒文件夾存在數(shù)據(jù)庫db,需要對(duì)db文件要求進(jìn)行加密!
一、對(duì)固定db進(jìn)行加解密
前提:此種加密db不需要進(jìn)行'增刪改'等操作,僅提供'查'的權(quán)限;
-
采取通用的加密工具:
pod 'FMDB/SQLCipher' 核心思路:打開數(shù)據(jù)庫open -> 設(shè)置秘鑰 setkey -> 查看連接 goodConnection -> 新建數(shù)據(jù)庫并遷移數(shù)據(jù),刪除老的數(shù)據(jù)庫;
-
新建繼承
FMDatabase的子類LCEncryptDatabase:a. 重寫父類四個(gè)函數(shù),新增一個(gè)函數(shù): 1. `-(BOOL)open;` 2. `-(BOOL)openWithFlags:(int)flags;` 3. `-(BOOL)openWithFlags:(int)flags vfs:(NSString *)vfsName;` 4. `-(const char*)sqlitePath;` 5. `-(void)setEncryptKey:(NSString *)encryptKey`; b. 不同版本的FMDB對(duì)應(yīng)的重寫方法不一致,下列拿2.5和2.75兩個(gè)版本舉例參考: 1. ~2.5版本:

- ~2.75版本:

-
在需要加密的地方調(diào)用 :
a.
[FMEncryptDatabase setEncryptKey:@"秘鑰"]; -
正常sql語句查詢讀取數(shù)據(jù)庫數(shù)據(jù);
a.限制:此查詢限制在[db close]前,當(dāng)數(shù)據(jù)庫關(guān)閉后再查詢讀取會(huì)報(bào)錯(cuò)
sqlite error :file is encrypted or is not a database;
二、對(duì)不固定db進(jìn)行加解密
前提:僅對(duì)數(shù)據(jù)庫進(jìn)行加解密,但不限制數(shù)據(jù)庫的'增刪改查';
注意點(diǎn):
1.需要根據(jù)對(duì)應(yīng)使用的數(shù)據(jù)庫<sqlite3、FMDB、LKDB等>做open和close區(qū)分;
2.可以設(shè)置數(shù)據(jù)庫自動(dòng)close時(shí)間進(jìn)行限制;
- 在[db open]的時(shí)候進(jìn)行解密:


- 在[db close] 時(shí)候進(jìn)行加密:


- 也支持修改數(shù)據(jù)庫秘鑰:

二、項(xiàng)目混淆
代碼混淆、控制流偽造、控制流扁平化、控制流簡(jiǎn)潔化、函數(shù)間接化、基本塊分裂<見'待用'>