由于版权、防盗用、防山寨的需要
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
beyondのMac-Pro:tmp_sqlite beyond$ ls
taiAlpha.sqlite
beyondのMac-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');
2.3、 解密数据库(未用到)
beyondのMac-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配置
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));
==========================完整流程如下=============================
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_"
4.将加密并且编码后的.sqlite拷贝到bundle中,在程序第一次安装的时候,
读取bundle中的加密并且编码后的.sqlite,使用GTMTool进行decode,
然后,才写入到document目录,文件名依然是:word.sqlite(但是已经进行过cipher的加密了)
5.设置FMDatabase.m的解密key(见QQ邮箱)