本文主要讲解“iOS开发安全的方法是什么”。本文的解释简单明了,易学易懂。请跟随边肖的思路,一起学习学习《iOS开发安全的方法是什么》!
一、网络方面
可以用抓包工具抓取手机通讯界面的数据。以Charles为例,用Charles可以得到http的所有明文数据。配置其证书后,可以模拟中间人攻击,在https加密前得到明文数据。
让我们简单谈谈什么是中间人攻击:
客户端:“我是客户端,把你的公钥给我”——服务器(被中间人拦截)。
所以现在是:
客户中间人,
中间人然后将消息转发给服务器,即:
中间人-服务器。
服务器将带有公钥的信息发送给客户端,但在中间被拦截。所以它是:
服务器-[服务器的公钥]-中间人。
中间人用自己的公钥替换服务器的公钥并发送给客户端,自称是服务器的公钥:
中间的人-[中间的人的公钥]-客户
客户端用得到的公钥加密,实际上是用中间人的公钥加密的,所以中间人可以用自己的私钥解密得到原始数据,然后用服务器的公钥加密原始数据(或修改原始数据内容)并发送给服务器。
通过这种方式,中间人可以获得双方之间的通信数据,并创建虚假数据。
让我们从如何预防开始:
1、SSL锁定
SSL Pinning的原理是将服务器的公钥存储在客户端,客户端会检查服务器返回的证书和客户端保存的证书是否一致,从而避免中间人替换证书的攻击。
SSL pinking的实现比较简单,只需将CA证书放入项目中,通过安全框架在NSURLSession上实现SSL pinking即可。如果使用AFNetworking,代码会更简单:
这样,如果查尔斯抓住了包,他会报告一个错误。
证书验证只能验证公钥(AFSSLPinningModePublicKey)或完全验证证书(AFSSLPinningModeCertificate)。
但是SSL Pinning有一个严重的问题,那就是如果证书有问题,只能通过发布新版本来解决。如果新版本一直不被批准,app的网络通讯就会全部挂掉。
例如,赛门铁克证书不受谷歌和iOS12的信任。如果app有内置证书,必须重新颁发。
2.加密接口内容。
很多app接口只对请求的参数进行加密验证,接口返回的数据是明文。如果不使用SSL Pinning来防止中间人攻击,接口返回的数据也可以加密,这样数据包捕获工具仍然无法破解数据包。
比如微信,微信里的界面使用http协议,但是内容都是加密的。
现在常用对称加密,加密效率比较快。如果app中有些数据特别重要,还是要使用非对称加密。非对称加密比较安全,但是效率会比较慢。
二、日志
1.Swift日志
Swift中打印日志的语法可以是print,也可以是NSLog。但是尽量不要用NSLog,因为Swift里面用的是NSLog,可以在系统日志里面找到。您可以通过pp助手、iTools或Xcode的设备和模拟器查看系统日志。
打印日志不会出现在系统日志中。
2.OC日志
不要在发布环境中输出NSLog日志。一般大家都会用宏定义来解决问题,如下:
三、信息的存储
1.钥匙
大多数程序员喜欢将键直接放入宏或常量中。
例如#定义AES _ key @“AAA 123”
这很容易被反编译。安全性差。以下方法可以用来加强安全性,增加破解难度。
1.1.加密密钥(A),然后将其定义为宏(B)。使用时,解密得到密钥(A)。其中用于加密密钥a的密钥是C.
因为
在宏定义的时候我们如果定义成字符串,会直接存在data段,这样破解者很容易获取到。比较安全的做法是把C和B定义成uint8_t[]数组,这样每个字符就会放到text段的每个单独指令中。指令执行后生成字符串。这样就会很安全。
1.2、用一段长文本,按规则提取出里面的密钥,密钥是随机的。
在服务端和客户端定义一段长文本,app端随机生成起始位置和长度,把起始位置和长度进行移位等操作,生成相应的数字,对数字进行Base64编码,生成的字符串 传给服务端,服务端根据这个字符串 就能 解析出相关的密钥。
代码如下:
这样只是增加了破解者获取密钥的难度,其实并不能完全阻止破解者获取。
2、Keychain
越狱的iPhone可以查看导出Keychain保存的信息。Keychains的内容存放在sqlite中,目录为:/private/var/Keychains。可以通过keychain-dump可以查看钥匙串里存放的的内容。
所以保存到Keychain的数据一定要是加密之后的数据。
3、plist、sqlite
plist、sqlite可以直接在ipa安装文件中获取到,所以不要在这些文件中存放重要信息,如果要保存,就进行加密后再存放。
四、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的功能、提示该手机不安全 等。
感谢各位的阅读,以上就是“iOS开发安全的方法是什么”的内容了,经过本文的学习后,相信大家对iOS开发安全的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/153166.html