App如何避免网络安全隐患

目前很多的APP在安全防控这块都相对于比较薄弱,从而导致存在很多安全隐患和事故,今天我们从以下几个方面来聊聊开发人员平时怎么做才更安全。

一、网络

Charles抓包工具,App开发者可能不会陌生,通常开发者在与后台接口联调的时候可通过设置代理抓取手机通信接口的数据。用Charles可以获取http的所有明文数据,配置好它的证书后就可以模拟中间人攻击,获取https加密前的明文数据。

1.1 中间人攻击

在这里插入图片描述

1.2 如何防范中间人攻击?

1.2.1 SSL Pinning

SSL Pinning的原理就是把服务端的公钥存到客户端中,客户端会校验服务端返回的证书是否和客户端保存的一致,这样就避免了中间人替换证书进行的攻击。
SSL Pinning的实现比较简单,只需要把CA证书放入项目中,通过Security framework实现NSURLSession上的SSL Pinning。如果用的是AFNetworking,代码更简单一点:
在这里插入图片描述
证书验证有可以只验证公钥(AFSSLPinningModePublicKey),也可以完全验证证书(AFSSLPinningModeCertificate)。
但是用SSL Pinning有个很严重的缺点,就是如果证书有问题,只有发布新版本才能解决。如果新版本一直审核不通过,app的网络通信就全部挂掉了。

1.2.2 传输内容加密

对称加密:加密效率比较快。
非对称加密:非对称加密更安全,但是效率会比较慢。

二、日志

2.1 Swift日志

Swift中可以用NSLog或者Print打印日志,但尽量别用NSLog,因为NSLog输出的系统日志中是能查到的。用print打印日志就不会出现在系统日志中。

2.2 OC日志

在release环境下不要输出NSLog日志,可通过宏进行设置。

三、信息的存储

3.1 密钥

大部分的程序员喜欢直接把密钥放到宏或者常量里。

如:#define AES_KEY @“aaa123"

这样做很容易就可以被反编译出来。安全性比较差。
可以用以下方法加强安全,增加破解的难度。

  1. 对密钥(A)进行加密后定义为宏(B),使用的时候进行解密得到密钥(A)。其中对密钥A加密的密钥为C。
  2. 因为在宏定义的时候我们如果定义成字符串,会直接存在data段,这样破解者很容易获取到。比较安全的做法是把C和B定义成uint8_t[]数组,这样每个字符就会放到text段的每个单独指令中。指令执行后生成字符串。这样就会很安全。
  3. 用一段长文本,按规则提取出里面的密钥,密钥是随机的。在服务端和客户端定义一段长文本,app端随机生成起始位置和长度,把起始位置和长度进行移位等操作,生成相应的数字,对数字进行Base64编码,生成的字符串 传给服务端,服务端根据这个字符串 就能 解析出相关的密钥。

这样只是增加了破jie者获取密钥的难度,其实并不能完全阻止破jie者获取。

3.2 Keychain

越狱的iPhone可以查看导出Keychain保存的信息。Keychains的内容存放在sqlite中,目录为:/private/var/Keychains。可以通过keychain-dump可以查看钥匙串里存放的的内容。所以保存到Keychain的数据一定要是加密之后的数据。

3.3 plist、sqlite

plist、sqlite可以直接在ipa安装文件中获取到,所以不要在这些文件中存放重要信息,如果要保存,就进行加密后再存放。

四、app加固

4.1 代码混淆

代码混淆就是把易读的类名、方法名替换成不易读的名字。常用的方法有宏替换和脚本替换。

比如本来方法名为:- (void)loadNetData; 进行代码混淆后,用class-dump导出头文件后会显示成修改后的方法名:-(void)showxhevaluatess;

4.2 用C语言

核心代码用C语言写,但是C语言的函数也可以被hook,比如用fishhook。开发人员可以用静态内联函数来防止hock。

4.3 检测tweak

可以检测 /Library/MobileSubstrate/DynamicLibraries 下的 plist 文件里是否包含自己app的bundle id。如果包含,可以进行限制app的功能、提示该手机不安全 等。

4.4 检测是否设置代理

(1)检测当前手机是否有开启代理
在这里插入图片描述

(2)NSURLSession实例化需要传入NSURLSessionConfiguration对象,config中有个属性是connectionProxyDictionary,保存的是网络会话连接中的代理服务器。所以,不走代理服务器只需要Hook系统方法,将此属性置为空字典即可。
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值