这篇文章以前本身在公司的技术分享学院发表了。如今发到本身的博客上。程序员
如今不少iOS的app没有作任何的安全防范措施。今天咱们就聊聊iOS开发人员平时怎么作才更安全。sql
1、网络方面数组
用抓包工具能够抓取手机通讯接口的数据。以Charles为例,用Charles能够获取http的全部明文数据,配置好它的证书后就能够模拟中间人攻击,获取https加密前的明文数据。安全
先简要的说下什么是中间人攻击:微信
①客户端:“我是客户端,给我你的公钥”-> 服务端(被中间人截获)。网络
因此如今是:app
客户端->中间人,函数
②而后中间人把消息转给服务端,也就是:工具
中间人->服务端。ui
③服务端把带有公钥的信息发送给客户端,可是被中间截获。因此是:
服务端-[服务端的公钥] ->中间人。
④中间人把服务端的公钥替换成本身的公钥,发送给客户端,声称是服务端的公钥:
中间人-[中间人的公钥] ->客户端
⑤客户端用获得的公钥加密,实际是用的中间人的公钥进行的加密,因此中间人能够用本身的私钥解密,获取原始数据,而后再用服务端的公钥对原始数据(或者修改原始数据内容)加密后发送给服务端。
这样中间人就能够获取到双方的通讯数据,并能够制造虚假数据。
下面开始说如何防范:
1、SSL Pinning
SSL Pinning的原理就是把服务端的公钥存到客户端中,客户端会校验服务端返回的证书是否和客户端保存的一致,这样就避免了中间人替换证书进行的攻击。
SSL Pinning的实现比较简单,只须要把CA证书放入项目中,经过Security framework实现NSURLSession上的SSL Pinning。若是用的是AFNetworking,代码更简单一点:
这样经过Charles抓包就会报错。
证书验证有能够只验证公钥(AFSSLPinningModePublicKey),也能够彻底验证证书(AFSSLPinningModeCertificate)。
可是用SSL Pinning有个很严重的问题,就是若是证书有问题,只有发布新版本才能解决。若是新版本一直审核不经过,app的网络通讯就所有挂掉了。
好比赛门铁克(Symantec)证书被google和iOS12不信任的问题。若是app内置了证书,就必需要从新发版。
2、接口内容进行加密
不少的app接口只对请求的参数进行加密和各类验证,而接口返回过来的数据就是明文。若是不用SSL Pinning来防止中间人攻击,也能够把接口返回的数据也进行加密,这样抓包工具抓到包后也依然不能破解。
好比微信,微信中的接口用的是http协议,可是内容所有进行了加密。
如今经常使用的是对称加密,加密效率比较快。若是app里有的数据特别重要,仍是要用非对称加密,非对称加密更安全,可是效率会比较慢。
2、日志
1、Swift日志
Swift中打印日志的语法能够用print,也能够用NSLog。可是尽可能别用NSLog,由于Swift中用NSLog,系统日志中是能查到的。能够经过pp助手、iTools或者Xcode的Devices and Simulators 来查看系统日志。
用print打印日志就不会出如今系统日志中。
2、OC日志
在release环境下不要输出NSLog日志。通常你们都会用宏定义解决,好比:
3、信息的存储
1、密钥
大部分的程序员喜欢直接把密钥放到宏或者常量里。
如:#define AES_KEY @“aaa123"
这样作很容易就能够被反编译出来。安全性比较差。能够用如下方法增强安全,增长破解的难度。
1.一、对密钥(A)进行加密后定义为宏(B),使用的时候进行解密获得密钥(A)。其中对密钥A加密的密钥为C。
由于在宏定义的时候咱们若是定义成字符串,会直接存在data段,这样破解者很容易获取到。比较安全的作法是把C和B定义成uint8_t[]数组,这样每一个字符就会放到text段的每一个单独指令中。指令执行后生成字符串。这样就会很安全。
1.二、用一段长文本,按规则提取出里面的密钥,密钥是随机的。
在服务端和客户端定义一段长文本,app端随机生成起始位置和长度,把起始位置和长度进行移位等操做,生成相应的数字,对数字进行Base64编码,生成的字符串 传给服务端,服务端根据这个字符串 就能 解析出相关的密钥。
代码以下:
这样只是增长了破解者获取密钥的难度,其实并不能彻底阻止破解者获取。
2、Keychain
越狱的iPhone能够查看导出Keychain保存的信息。Keychains的内容存放在sqlite中,目录为:/private/var/Keychains。能够经过keychain-dump能够查看钥匙串里存放的的内容。
因此保存到Keychain的数据必定要是加密以后的数据。
3、plist、sqlite
plist、sqlite能够直接在ipa安装文件中获取到,因此不要在这些文件中存放重要信息,若是要保存,就进行加密后再存放。
4、app加固
1、代码混淆
代码混淆就是把易读的类名、方法名替换成不易读的名字。经常使用的方法有宏替换和脚本替换。
好比原本方法名为:- (void)loadNetData; 进行代码混淆后,用class-dump导出头文件后会显示成修改后的方法名:- (void)showxhevaluatess;
2、用C语言
核心代码用C语言写,可是C语言的函数也能够被hook,好比用fishhook。开发人员能够用静态内联函数来防止hock,破解者就只能去理解代码的逻辑。
3、检测tweak
能够检测/Library/MobileSubstrate/DynamicLibraries 下的plist 文件里是否包含本身app的bundle id。若是包含,能够进行限制app的功能、提示该手机不安全 等。