iOS开发如何避免安全隐患
现在很多iOS的APP没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们来聊聊iOS开发人员平时怎么做才更安全。
一、网络方面
用抓包工具可以抓取手机通信接口的数据。以Charles为例,用Charles可以获取http的所有明文数据,配置好它的证书后就可以模拟中间人攻击,获取https加密前的明文数据。
1.1 中间人攻击
先简要地说下什么是中间人攻击:
①客户端:“我是客户端,给我你的公钥” -> 服务端(被中间人截获)。
所以现在是:
客户端->中间人
②然后中间人把消息转给服务端,也就是:
中间人->服务端
③服务端把带有公钥的信息发送给客户端,但是被中间截获。所以是:
服务端-[服务端的公钥] ->中间人
④中间人把服务端的公钥替换成自己的公钥,发送给客户端,声称是服务端的公钥:
中间人-[中间人的公钥] ->客户端
⑤客户端用得到的公钥加密,实际是用中间人的公钥进行加密,所以中间人可以用自己的私钥解密,获取原始数据,然后再用服务端的公钥对原始数据(或者修改原始数据内容)加密后发送给服务端。
这样中间人就可以获取到双方的通信数据,并可以制造虚假数据。
1.2 如何防范中间人攻击?
下面开始说如何防范:
1.2.1 SSL Pinning
SSL Pinning的原理就是把服务端的公钥存到客户端中,客户端会校验服务端返回的证书是否和客户端保存的一致,这样就避免了中间人替换证书进行的攻击。
SSL Pinning的实现比较简单,只需要把CA证书放入项目中,通过Security framework实现NSURLSession上的SSL Pinning。如果用的是AFNetworking,代码更简单一点:
这样通过Charles抓包就会报错。
证书验证有可以只验证公钥(AFSSLPinningModePublicKey),也可以完全验证证书(AFSSLPinningModeCertificate)。
但是用SSL Pinning有个很严重的问题,就是如果证书有问题,只有发布新版本才能解决。如果新版本一直审核不通过,app的网络通信就全部挂掉了。
比如赛门铁克(Symantec)证书被google和iOS12不信任的问题。如果app内置了证书,就必须要重新发版。
1.2.2 接口内容进行加密
很多的app接口只对请求的参数进行加密和各种验证,而接口返回过来的数据就是明文。如果不用SSL Pinning来防止中间人攻击,也可以把接口返回的数据也进行加密,这样抓包工具抓到包后也依然不能破解。
比如微信,微信中的接口用的是http协议,但是内容全部进行了加密。
现在常用的是对称加密,加密效率比较快。如果app里有的数据特别重要,还是要用非对称加密,非对称加密更安全,但是效率会比较慢。
二、日志
2.1 Swift日志
Swift中打印日志的语法可以用print,也可以用NSLog。但是尽量别用NSLog,因为Swift中用NSLog,系统日志中是能查到的。可以通过pp助手、iTools或者Xcode的Devices and Simulators 来查看系统日志。
用print打印日志就不会出现在系统日志中。
2.2 OC日志
在release环境下不要输出NSLog日志。一般大家都会用宏定义解决,如下:
三、信息的存储
3.1 密钥
大部分的程序员喜欢直接把密钥放到宏或者常量里。
如:#define AES_KEY @“aaa123"
这样做很容易就可以被反编译出来。安全性比较差。可以用以下方法加强安全,增加破解的难度。
对密钥(A)进行加密后定义为宏(B),使用的时候进行解密得到密钥(A)。其中对密钥A加密的密钥为C。
因为在宏定义的时候我们如果定义成字符串,会直接存在data段,这样破解者很容易获取到。比较安全的做法是把C和B定义成uint8_t[]数组,这样每个字符就会放到text段的每个单独指令中。指令执行后生成字符串。这样就会很安全。
用一段长文本,按规则提取出里面的密钥,密钥是随机的。
在服务端和客户端定义一段长文本,app端随机生成起始位置和长度,把起始位置和长度进行移位等操作,生成相应的数字,对数字进行Base64编码,生成的字符串 传给服务端,服务端根据这个字符串 就能 解析出相关的密钥。
代码如下:
这样只是增加了破解者获取密钥的难度,其实并不能完全阻止破解者获取。
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的功能、提示该手机不安全 等。
作者:何继昌
来源:宜信技术学院
拓展阅读:数据中台:宜信敏捷数据中台建设实践|分享实录
转载于:https://juejin.im/post/5cef5203f265da1bc23f5bdf
iOS开发如何避免安全隐患相关推荐
- iOS(马甲包)开发如何避免安全隐患
现在很多iOS的APP没有做任何的安全防范措施,导致存在很多安全隐患和事故,今天我们来聊聊iOS开发人员平时怎么做才更安全. 一.网络方面 用抓包工具可以抓取手机通信接口的数据.以Charles为例, ...
- iOS开发多线程篇—线程安全
一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数 ...
- iOS开发——高级篇——iOS开发之网络安全密码学
一.非对称加密 - RSA : + 公钥加密,私钥解密: + 私钥加密,公钥解密: + 只能通过因式分解来破解 二.对称加密 - DES - 3DES - AES (高级密码标准,美国国家安全局使用, ...
- 移动互联网时代,学iOS开发好吗
互联网是21世纪的主导产业,在网络行业发展史明确的选择.iOS的上市也开辟了智能手机的新市场,一时间好评如潮,一大批年轻人开始潜心研究它.随着"互联网"的来临,iOS系统正在成为全 ...
- iOS开发常用三方库、插件、知名博客
TimLiu-iOS iOS开发常用三方库.插件.知名博客等等,期待大家和我们一起共同维护,同时也期望大家随时能提出宝贵的意见(直接提交Issues即可). 持续更新... 版本:Objective- ...
- ios非常全的库iOS开发 非常全的三方库、插件、大牛博客等等
转自: TimLiu-iOS Swift版本点击这里欢迎加入交QQ流群: 594119878 github排名 https://github.com/trending,github搜索:https:/ ...
- 【iOS开发】跨平台开发再次袭来
转自喵神博客:点击打开链接 这篇文章主要想谈谈最近又刮起的移动开发跨平台之风,并着重介绍和对比一下像是Xamarin,NativeScript 和 React Native 之类的东西.不会有特别深入 ...
- 高性能iOS开发--移动应用的性能
打算把<高性能iOS开发>这本书公开出来,供大家学习.这是第一章,感兴趣的可以订阅我的专题 高性能iOS应用开发. 本书假设你是 iOS 开发人员,有长期开发原生 iOS 应用的经验,并且 ...
- IOS开发UISearchBar失去第一响应者身份后,取消按钮不执行点击事件的问题
在iOS开发中,使用UISearchBar的时候,当搜索框失去焦点的时候,取消按钮是默认不能点击的,如图按钮的颜色是灰色的: 这是因为此时取消按钮的enabled属性被设置为NO了,那么当我们需 ...
最新文章
- system generator学习笔记【02】
- c语言猜拳游戏中出现的关键词,C语言猜拳游戏代码及分析
- 自学python清单-机器学习和Python怎样快速掌握?你一定需要这27张清单
- iptables —— Iptables防火墙规则使用梳理
- c#一种存储结构解决动态平衡问题
- AC日记——双栈排序 洛谷 P1155
- 关于Android的HAL的一些理解
- Spring Boot登录选项快速指南
- 《JavaScript高级程序设计》阅读笔记(一):ECMAScript基础
- mysql sphinx 中文搜索_sphinx+mysql+mmseg 实现中文全站搜索 安装配置文档
- MapReduce 示例:减少 Hadoop MapReduce 中的侧连接
- 40.leetcode17_letter_combinations_of_a_phone_number
- 【整理操作】MQTT简单使用学习
- 五十三、微信小程序云开发豆瓣电影小项目
- 外星人显卡拓展坞支持linux,今天,你给信仰充值了么?ALIENWARE 外星人 显卡扩展坞 简单开箱...
- Boring Old Menu Bar for Mac(菜单栏美化工具)
- 江浙沪地区计算机考研高效排名,江浙沪地区,哪所大学的法硕容易考上?
- 微信小程序头像上传+(C#)服务端接收
- 免费优质的网页设计素材网站推荐
- 日本语能力测试官方试题集
热门文章
- 算数基本定理(例题:LightOJ1341)
- 一个请求方法是一个线程吗?不是!
- Careercup - Google面试题 - 5424071030341632
- 分布式事务 dtc 的使用
- nohup 输出日志到文件_超详细的EFK安装部署教程--filebeat日志数据采集
- http默认超时时间_Bof 是一个HTTP客户端,旨在尽可能方便用户使用
- hdu4400 BFS+STL
- 【Android Gradle 插件】ProductFlavor 配置 ( multiDexEnabled 配置 | multiDexKeepFile | multiDexKeepProguard )
- 【Android 逆向】ELF 文件格式 ( ELF 文件简介 | ELF 文件结构 )
- 【错误记录】Android Studio 向 GitHub 提交代码报错 ( Push failed: Failed with error: Could not read | 使用命令行提交代码 )