现在很多iOS的应用没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们来聊聊iOS开发人员平时怎么做才更安全。
<强>一、网络方面强>
用抓包工具可以抓取手机通信接口的数据。以查尔斯为例,用查尔斯可以获取http的所有明文数据,配置好它的证书后就可以模拟中间人攻击,获取https加密前的明文数据。
1.1中间人攻击
先简要地说下什么是中间人攻击:
①客户端:“我是客户端,给我你的公钥”→服务端(被中间人截获)。
所以现在是:
客户端→中间人
②然后中间人把消息转给服务端,也就是:
中间人→服务端
③服务端把带有公钥的信息发送给客户端,但是被中间截所获。以是:
服务端-[服务端的公钥)→中间人
④中间人把服务端的公钥替换成自己的公钥,发送给客户端,声称是服务端的公钥:
中间人-[中间人的公钥)→客户端
⑤客户端用得到的公钥加密,实际是用中间人的公钥进行加密,所以中间人可以用自己的私钥解密,获取原始数据,然后再用服务端的公钥对原始数据(或者修改原始数据内容)加密后发送给服务端。
这样中间人就可以获取到双方的通信数据,并可以制造虚假数据。
1.2如何防范中间人攻击?
下面开始说如何防范:
1.2.1 SSL寄
SSL寄予的原理就是把服务端的公钥存到客户端中,客户端会校验服务端返回的证书是否和客户端保存的一致,这样就避免了中间人替换证书进行的攻击。
SSL寄的实现比较简单,只需要把CA证书放入项目中,通过安全框架实现NSURLSession上的SSL钉。如果用的是AFNetworking,代码更简单一点:
这样通过查尔斯抓包就会报错。
证书验证有可以只验证公钥(AFSSLPinningModePublicKey),也可以完全验证证书(AFSSLPinningModeCertificate)。
但是用SSL将有个很严重的问题,就是如果证书有问题,只有发布新版本才能解决。如果新版本一直审核不通过,应用的网络通信就全部挂掉了。
比如赛门铁克(赛门铁克)证书被谷歌和iOS12不信任的问题。如果应用内置了证书,就必须要重新发版。
1.2.2接口内容进行加密
很多的应用程序接口只对请求的参数进行加密和各种验证,而接口返回过来的数据就是明文。如果不用SSL寄来防止中间人攻击,也可以把接口返回的数据也进行加密,这样抓包工具抓到包后也依然不能破解。
比如微信,微信中的接口用的是http协议,但是内容全部进行了加密。
现在常用的是对称加密、加密效率比较快。如果应用里有的数据特别重要,还是要用非对称加密,非对称加密更安全,但是效率会比较慢。
<强>二,日志迅速2.1日志强>
迅速中打印日志的语法可以用打印,也可以用NSLog。但是尽量别用NSLog,因为迅速中用NSLog,系统日志中是能查到的。可以通过pp助手,iTools或者Xcode的设备和模拟器来查看系统日志。
用打印打印日志就不会出现在系统日志中。
2.2 OC日志
在释放环境下不要输出NSLog日志。一般大家都会用宏定义解决,如下:
<强>三、信息的存储3.1密钥强>
大部分的程序员喜欢直接把密钥放到宏或者常量里。
如:#定义AES_KEY @“aaa123”
这样做很容易就可以被反编译出来。安全性比较差。可以用以下方法加强安全,增加破解的难度。
对密钥(A)进行加密后定义为宏(B),使用的时候进行解密得到密钥(A)。其中对密钥一加密的密钥为c .
因为在宏定义的时候我们如果定义成字符串,会直接存在数据段,这样破解者很容易获取到。比较安全的做法是把C和B定义成uint8_t[]数组,这样每个字符就会放到文本段的每个单独指令中。指令执行后生成字符串。这样就会很安全。