对 iOS 数据安全的一次小探索
一、主流保证数据安全的方式 1、网络传输安全 1.采用HTTPS通信协议 可防止抓包窃取、篡改传输数据,大大增加了中间人攻击的成本。 2.对敏感数据进行签名校正 采用非对称加密的方式,对敏感数据使用密钥加密,到了客户端用公钥解密,验证数据一致性,防止通信过程中被篡改。 3.采用密文传输 别人即使截取了传输信息,也无法看懂其中的意思。 2、本地存储数据安全 1.数据库加密 通过越狱设备可以很容易地把整个应用包(包括里面的数据)copy出来,这样就可以获取里面的数据库,对于没有加密的数据库就可以非常轻易地读取里面的信息,造成信息的泄漏。 数据库加密可分两个维度:1.整个数据库加密;2.对部分字段先加密再存数据库。 对部分字段加密并不适合多字段的加密存储,容易导致加密数据太过分散,影响性能。所以推荐对整个数据库加密。 2.KeyChain存储敏感数据 KeyChain是iOS系统级的存储方式,安全性无需质疑,且删除应用或者升级系统依然可以保留里面的信息。 3、源码安全 使用越狱设备可以很轻易地把应用砸壳,从而把源码dump下来,即使是没有太多经验的开发者也可以得到应用的类信息,包括函数名等。使用IDA等反编译工具可以看到应用的一些类名和方法名,进而可以分析功能实现的逻辑。 1.字符串混淆 对应用程序中使用到的字符串进行加密,保证源码被逆向后也能保护明文字符串。 2.类名、方法名混淆 市面上很多iOS应用都没有混淆类名方法名,以致于很容易使用class-dump下来,从而进行hook操作,一步一步实现iOS微信自动抢红包(非越狱)是很有趣的一个应用。这个库可以混淆OC的类名、协议、属性还有方法名。 3.程序结构混淆加密 对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。可参考这个库 4.反调试、反注入等一些主动保护策略 加入第三方安全性SDK 二、对数据库加密的研究 1、主流数据库加密方式 The SQLite Encryption Extension(收费) SQLiteEncrypt(收费) SQLiteCrypt(收费) SQLCipher(开源免费) 只有SQLCipher是免费的,所以本文主要对SQLCipher进行研究。 2、引入SQLCipher第三方库 1.手动引入 请参考官方教程。 2.使用CocoaPods pod 'FMDB/SQLCipher', '2.5' 3、SQLCipher的可行性研究 1.新建加密数据库 若没有旧数据的情况下使用很简单,只需要在FMDatabase里面的-open和-openWithFlags:方法里面添加[self setKey:kDatabaseEncryptKey];即可。 如下图所示 但是在团队协作中,如果直接修改pod仓库里面的文件,可能不好同步,下面有一个技巧,就是继承FMDatabase和FMDatabaseQueue并重载其中的方法。 继承FMDatabase的子类需要重载以下方法 - (BOOL)open { if (_db) { return YES; } int err = sqlite3_open([self sqlitePath], &_db ); if(err != SQLITE_OK) { NSLog(@"error opening!...