iOS_加密保护2_sqlite

由于版权、防盗用、防山寨的需要

ipa的bundle中内置的sqlite数据库需要进行加密,

用户安装app时,bundle中的sqlite数据库是进行加密后的


致未来的我 请注意: app中所有用到的sqlite数据库加密Key+GTMBase64加密Key,全部备份在QQ邮箱里


加密的具体思路是:

1、先将bundle中的明文数据库taiAlpha.sqlite,拷贝出来,放到桌面

2、使用命令行,对明文数据库进行加密encrypted_taiAlpha.db

3、新建一个Mac 命令行项目,对该文件encrypted_taiAlpha.db进行二次加密,具体如下

4、读取文件的data

5、对前1000位进行异或处理

6、使用GTMBase64编码data,下载地址

7、将加密后的data,写到桌面文件

8、重新放回到bundle中


解密过程:

1、程序第一次启动时,先从bundle读取到数据库文件的data

2、使用GTMBase64解码data

3、对前1000位进行异或处理

4、根据data 生成数据库文件,存入document目录

5使用带加密功能的FMDB打开数据库





加密过程的 详细步骤:

2.1安装brew,在终端输入命令:  

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装sqlcipher,在终端输入命令:

brew install sqlcipher

2.2 加密已有的数据库

beyondのMac-Pro:tmp_sqlite beyond$ pwd

/Users/beyond/Desktop/tmp_sqlite

beyondMac-Pro:tmp_sqlite beyond$ ls

taiAlpha.sqlite

beyondMac-Pro:tmp_sqlite beyond$sqlciphertaiAlpha.sqlite 

SQLCipher version 3.8.10.2 2015-05-20 18:17:19

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> ATTACH DATABASE 'encrypted_taiAlpha.db' AS encrypted KEY 'beyond.2016.xsism.com';

sqlite> SELECT sqlcipher_export('encrypted');
sqlite> DETACH DATABASE encrypted;




2.3、 解密数据库(未用到)

beyondMac-Pro:tmp_sqlite beyond$sqlcipherencrypted_taiAlpha.db

SQLCipher version 3.8.10.2 2015-05-20 18:17:19

Enter ".help" for instructions

Enter SQL statements terminated with a ";"

sqlite> PRAGMA key = 'beyond.2016.xsism.com';

sqlite> ATTACH DATABASE 'plain_taiAlpha.sqlite' AS plaintext KEY '';

sqlite> SELECT sqlcipher_export('plaintext');


sqlite> DETACH DATABASE plaintext;

sqlite> .quit






解密过程的详细步骤:

5、使用带加密功能的FMDB打开数据库,具体操作如下

5.1、在工程里,拖加入sqlite3.h 和 sqlite3.c,下载地址

5.2、在target –> Build Setting –> Other C Flags添加

-DSQLITE_HAS_CODEC
-DSQLITE_THREADSAFE
-DSQLCIPHER_CRYPTO_CC
-DSQLITE_TEMP_STORE=2

5.3、在target –> Build Setting –> Other Linker Flags添加-framework Security配置

iOS_加密保护2_sqlite_第1张图片


5.4、 打开FMDatabase.m,在方法

- (BOOL)openWithFlags:(int)flags vfs:(NSString *)vfsName

添加

//加密 OR 输入密码
    const char* key = [@"beyond.2016.xsism.com" UTF8String];
    sqlite3_key(_db, key, strlen(key));
iOS_加密保护2_sqlite_第2张图片






==========================完整流程如下=============================

1.把项目中原始的.sqlite放到一个桌面的一个文件夹内



2.在命令行中,手动对所有的.sqlite进行sqlcipher加密,加密后所有的文件都有一个前缀"encrpted_"

sqlcipher syntax.sqlite 

ATTACH DATABASE 'encrypted_syntax.sqlite' AS encrypted KEY '见QQ邮箱';

SELECT sqlcipher_export('encrypted');

DETACH DATABASE encrypted;

.quit


3.用一个新的文件夹cypher存放已经cypher加密后的文件,接下来遍历进行base64编码,使用的工具是GTMTool,

生成的文件前缀是"encode_"



iOS_加密保护2_sqlite_第3张图片


4.将加密并且编码后的.sqlite拷贝到bundle中,在程序第一次安装的时候,

读取bundle中的加密并且编码后的.sqlite,使用GTMTool进行decode,

然后,才写入到document目录,文件名依然是:word.sqlite(但是已经进行过cipher的加密了)


5.设置FMDatabase.m的解密key(见QQ邮箱)














你可能感兴趣的:(ios,数据库,加密,解密,编码)