iOS APP 安全测试

1、ipa包加壳

  首先,我们可以通过iTunes 下载 AppStore的ipa文件(苹果 把开发者上传的ipa包 进行了加壳再放到AppStore中),所以我们从AppStore下载的ipa都是加壳的,所以不能直接用来反编译。

  得到ipa文件 可以分析APP 里包含的一些资源,如:图片、plist文件、静态wap页、.bundle 等。

  所以不要 在plist文件、项目中的静态文件中 存储关键的信息,如果要保存,记得 对称加密(这样可以增加破解的难度)。

  如果是越狱的手机,从 手机上的PP助手下载的ipa包 都是 脱壳之后的,可以直接用来反编译。

 

2、敏感信息存储位置

  我们可以用软件 查看 APP的沙盒,查看里面存储的 文件:sqlite、plist(NSUserdefault会存到Library下的Preferences中 的 plist文件中)、图片等,NSUserdefault 中不要保存关键信息,如果要保存,还是加密吧。。sqlite也是这样子的。

  iOS 8.3之前 不越狱的手机也可以 直接用MAC上的PP助手、iTool 来查看 任何APP的沙盒(系统APP除外)。iOS 8.3之后就不行了。

  越狱手机都可以查看任意APP的沙盒,包括系统APP的沙盒。还有iOS的系统目录等。

 

3、设备安全(越狱,丢失)

  越狱手机直接用PP助手下载的就是 脱壳的ipa,所以不用再脱了。对AppStore下载的ipa包 可以用工具对加壳的ipa 进行脱壳,再用IDA、Hopper 进行反编译,进行分析 ,可以得到 近乎易懂的 伪代码。但是反编译后的代码 要 一个方法一个方法的去分析,类似面向过程编程。。当然也有工具 去提取 项目中的所有.h文件。不过 反编译 终归是个 耐心的活,急躁的人容易砸电脑。

 

4、APP反编译(逆向工程)

  所有的APP都是可以反编译的,所以 很关键的数据 最好通过接口获取。

  那么接口如何保证安全呢。首先用HTTPS,虽然HTTPS已经很安全了,但是数据也是有可能被破解的,这个后面会介绍。。所以 接口一定要自己加密。

  非对称加密(RSA)现在 还是没有办法破解的,但是因为 非对称加密的效率低,所以很少有企业将所有的接口都用非对称加密。

  接口如果用对称加密,密钥 放到代码里 是能被反编译出来的。如果你的 APP的安全性很高,就不要把密钥 写到代码里。

 

    可以这样处理:

  先通过非对称加密的接口 获取密钥,然后 再在 后面的 接口通信中 用这个密钥进行加密。这样做 就类似 HTTPS 的简化版实现了。安全性很高。目前应该 是不能破解的。

 

 

5、代码内容加密(对称加密/非对称加密)

  根据APP的安全性,也可以把 关键数据 写在代码里,可以保存的是加密后的数据。比如,我给一个变量赋值:U2FsdGVkX1+rN+sgpLmOYTqoVhRRerZj9oobZAIPzjo=,你不知道 我这个字符串解密后是 123456,我只是使用的时候才解密处理用。

  这样也只是增加了黑客获取关键数据的难度。

 

6、安全密钥更新周期

  密钥要定期更换。比如 3个月 或半年换一次,如果密钥是从接口通过非对称加密 获取的,直接修改服务端就可以了。

  如果密钥是写在代码里的。就等APP升级新的版本的时候,新版本的APP和其对应的接口版本 都 修改为新的密钥 就可以了。

  旧的接口版本和APP版本还用以前的密钥,等强制更新的时候才会失效。

  如果一个APP 一个密钥用上几年都不变 ,是很危险的。离职的人员都可以直接用以前 的代码 来获取相关的数据。特别是 支付相关的,有的服务端甚至没有 去校验支付的金额或其他数据,导致 离职人员用1分钱 可以买到 任何价格的 线上产品(服务端这种在线上环境留后门的安全性问题,我是真的遇到有人这么搞)。。

 

7、代码混淆

  最好能 进行 代码混淆,能增加反编译的难度,当然只是增加了难度,还是能破解的。但是 代码混淆 的 性价比是很高的,就是你这边付出了 一点时间,而黑客 就要多付出几十倍 的时间。。其实 接口 自己加密 的性价比也很高。

 

8、接口安全(双向加密)

  接口返回的数据 最好也进行 加密。比如,现在大家都连我的热点,或者代理服务器,我是有可能 直接 获取你的APP的 HTTPS 解密后的json数据(如何获取相见《逆向工程》)。当然,如果你觉得 你的APP返回的json数据都是 不重要的,也可以不对数据进行加密。

  像微信、QQ、支付宝这种 安全性高的,通信两边的数据 收发  都 应该 进行加密的。

 

9、通讯安全,第三方库漏洞

  像HTTPS本身 是否有漏洞这种我们就不去说了。就 去年iOS的AFNetworking 漏洞事件,完全是 代码的问题。虽然不是HTTPS的安全机制的问题。但是 黑客还是能很容易拿到HTTPS解密后的数据。

  去年iOS的AFNetworking曝SSL漏洞  就涉及2.5万个APP。 有的银行的APP,只用了HTTPS,通信都不加密,就很容易拿到明文数据了。有的APP里的各种数据都 采用复杂的加密算法,破解人员看到都烦,去破解这个APP的时间还不如去搞其他的几个APP。

  HTTPS 本身是安全的。但是数据还是可能被破解。所以 不要觉得 我只用HTTPS 就安全了。理论上 说任何 的 协议、代码都是可能有漏洞的,只是有的现在 还没被发现或破解,并不代表一直不能被破解。。

 

  10、敏感信息安全加密

  黑客不会 去一个手机一个手机的 把沙盒数据 拿出来 来看每个用户的数据(黑客也不可能拿到你的手机)。但是如果黑客捡到 你的手机 ,都不用登陆微信  就可以 通过微信APP的沙盒 拿到你和小三的偷情聊天记录、能拿到你的银行卡号,你的手机号(很多APP都把手机号、银行卡号、聊天记录 明文保存在沙盒里)。。你是不是会觉得微信 怎么这么low。我们只是拿微信举个例子,微信还不会这么low。

 

11、通讯网络安全

  黑客最主要的还是通过网络来获取 他们想要的数据(网络的安全级别是最高的)。如果恰好 你的APP 加密密钥 明文 保存到了沙盒里 或者 你的 数据通信 还没有进行加密,恭喜你,你的数据和裸奔没啥区别。。

  有人说:“我就做了个聊天的APP,没啥机密信息。再说 大家连的都是 公司的wifi、4G网络,不会有问题的,所以我的通信才不加密,麻烦。”

    举个搞笑的栗子:

  你现在在飞机场,连着免费wifi,正在和副总裁在微信里 谈着 价值100个亿的创意的时候,聊天记录已经被 黑客 抓包获取 ,然后卖给竞争对手了。。(只是举个例子,微信的加密是相当安全的,微信很多的通讯还是用的HTTP,但是就算你拿到他们数据,也是无法解密的。这里举例用微信,只是为了方便大家理解。免费wifi确实有可能是黑客设的坑,新闻上经常报道)。

  所以不要让自己的数据裸奔。。。

 

回到顶部

  12、代码调试信息安全管理

    代码方面:

    12.1、在release环境下 NSLog 不要打印日志 否则iOS系统日志里都可以查看到,在.pch文件中加下面的几行代码就可以解决。很早大家都这么做了。

复制代码
1 #ifdef DEBUG
2 #define NSLog(...) NSLog(__VA_ARGS__)
3 #define debugMethod() NSLog(@"%s", __func__)
4 #else
5 #define NSLog(...)
6 #define debugMethod()
7 #endif
复制代码

    现在很多APP的部分页面开始使用 Swift,在Swift 文件中是允许用 NSLog 的语法来打印,但是 不要这么做,因为 这样 就会导致这段代码在 release环境 中也可以正常输出。通过 PP助手、iTools,可以直接 查看 iOS的系统日志。也可以直接 通过Xcode-Window-Devices - 点最下面的向上的小箭头,来看日志。

    所以Swift中打印 还是用 print吧。

 

    12.2、AFNetworking 的 allowInvalidCertificates 属性 要设置成 false,validatesDomainName属性 设置成true。否则 HTTPS通信就可以被解密。这块涉及到AFnetworking 去年的通信漏洞 就不详述了。

    但是一般开发的 测试环境 的HTTPS 不是CA颁发的,而是自签名证书,访问的也不是域名,而是IP。所以可以在测试环境 忽略证书和域名,代码如下:

1 #ifdef DEBUG
2         manager.securityPolicy.allowInvalidCertificates = YES;
3         manager.securityPolicy.validatesDomainName = NO;
4 #endif

 

答疑:

  像上文中提到的 接口模拟HTTPS 进行通信,基本上是破解不了的。非对称加密毕竟还是 很安全的。

 

  黑客也是有时间成本的,有性价比的。文中多次 写到,可以增加破解的难度,不是这样做了 就一定 不会被破解。

 

  有人会觉得 在 代码中 加密了 反正也 能被破解,那还加啥密,反正没啥卵用。(比如 关键数据 加密 后 存到代码里)

  打个比方:我装个防盗门 反正也防不住贼,干脆...就别装门了,反正也没啥卵用。

 

  再比如:有几个房间放着同样价值的东西(账户数据、聊天数据等)。但这几个房间,有的是全封闭防炸弹的,有的就只是一个木门,有的甚至门都是开着的,你会选择哪个。。
  这就像为什么现在 iOS 系统的越狱速度越来越慢,不是说越狱人员的水平变低了,而是现在越狱的用户越来越少,像盘古这种公司通过越狱获得的盈利也越来越少了,自然投入的精力就会变少。

 

  关键数据加密后,存到代码里,这样总比你直接把明文保存到代码中更难破解,我们要做的是让黑客知道,你要来惹我,你就必须付出更多的时间和精力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/393943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 与 client端执行结果不一致_Oracle -PLSQLDeveloper 13 数据库连接

关于oracle 及PLSQLDeveloper 13如何下载,安装流程不一一赘述,网络帖子很多,知乎直接搜索亦可。本次主要分享:学习前辈们关于安装流程中出现设置报错,应如何处理(本人个例,通过网络找思路&#…

去除文件头部的u+feff_关于FEFF的简短故事,一个不可见的UTF-8字符破坏了我们的CSV文件

去除文件头部的ufeffToday, we encountered an error while trying to create some database seeds from a CSV. This CSV was originally generated by me using a Ruby script which piped the output to a file and saved as a CSV.今天,我们在尝试从CSV创建一些…

Redis——学习之路一(初识redis)

在接下来的一段时间里面我要将自己学习的redis整理一遍,下面是我整理的一些资料: Redis是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and store),所以redis是可以查看源代码https://github.com/MSOpenTe…

matlab 处理dat文件画图,matlab_DAT_processing matlab处理dat文件并进行绘图 - 下载 - 搜珍网...

matlab实验2/11.txtmatlab实验2/B00001.datmatlab实验2/B00002.datmatlab实验2/B00003.datmatlab实验2/B00004.datmatlab实验2/B00005.datmatlab实验2/B00006.datmatlab实验2/B00007.datmatlab实验2/corv.txtmatlab实验2/cory.txtmatlab实验2/matlab批量载入数据.txtmatlab实验…

leetcode面试题 08.03. 魔术索引(二分)

魔术索引。 在数组A[0…n-1]中,有所谓的魔术索引,满足条件A[i] i。给定一个有序整数数组,编写一种方法找出魔术索引,若有的话,在数组A中找出一个魔术索引,如果没有,则返回-1。若有多个魔术索引…

python返回序列中的最小元素_python实现获取序列中最小的几个元素

本文实例讲述了python实现获取序列中最小的几个元素。分享给大家供大家参考。具体方法如下:import heapqimport randomdef issorted(data):data list(data)heapq.heapify(data)while data:yield heapq.heappop(data)alist [x for x in range(10)]random.shuffle(a…

apache访问快捷方式

<VirtualHost *:80>   DocumentRoot "XXX"   ServerName XXX   Alias /pdodata/ "XXX"</VirtualHost> 其中 Alias /pdodata/ "XXX" /data/是快捷方式名称 后面的代表快捷方式具体目录名称转载于:https://www.cnblogs.com/…

css----实现checkbox图片切换

1、效果图 2、代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>checkbox</title><style type"text/css">label {width: 20px;font-size: 12px;cursor: pointer;}label i {display: inline-block…

Node.js 究竟是什么?

在网上看到一篇介绍Node.js的文章&#xff0c;很好的介绍了Node.js Michael Abernethy, 自由程序员, Freelancer 2011 年 10 月 09 日 (最初于 2011 年 4 月 26 日) Node.js 究竟是什么&#xff1f; 一个 “编码就绪” 服务器 Node 是一个服务器端 JavaScript 解释器&#xff…

react中绑定点击事件_在React中绑定事件处理程序的最佳方法

react中绑定点击事件by Charlee Li通过李李 在React中绑定事件处理程序的最佳方法 (The best way to bind event handlers in React) Binding event handlers in React can be tricky (you have JavaScript to thank for that). For those who know the history of Perl and P…

json_decode php数组,json_decode转化为数组加true,json_encode和json_decode区别

一、json_encode和json_decode区别1、json_encode&#xff1a;对象/数组 ---> json2、json_decode&#xff1a;json ---> 对象/数组二、json_decode转化为数组转化为数组时&#xff0c;第二个参数很重要&#xff1a;不加true会以PHP对象输出, 加true输出PHP数组&#xff…

leetcode1219. 黄金矿工(回溯)

你要开发一座金矿&#xff0c;地质勘测学家已经探明了这座金矿中的资源分布&#xff0c;并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量&#xff1b;如果该单元格是空的&#xff0c;那么就是 0。 为了使收益最大化&#xff0c;矿工…

【无删减】Python老司机收藏夹的17个国外免费学习网站

用Python编写代码一点都不难&#xff0c;事实上它一直被赞誉为最容易学的编程语言。如果你准备学习web开发&#xff0c; Python是一个不错的开始&#xff0c;甚至想做游戏的话&#xff0c;用Python来开发游戏的资源也有很多。这是快速学习这门语言的途径之一。许多程序员都把Py…

iframe vue 前进 后退_vue常见面试题

1、说说你对 SPA 单页面的理解&#xff0c;它的优缺点分别是什么&#xff1f;SPA&#xff08; single-page application &#xff09;仅在 Web 页面初始化时加载相应的 HTML、JavaScript 和 CSS。一旦页面加载完成&#xff0c;SPA 不会因为用户的操作而进行页面的重新加载或跳转…

C#编写运行在Linux环境下的采用Mediainfo来获取多媒体文件信息的代码

C#编写运行在Linux环境下的采用Mediainfo来获取多媒体文件信息的代码 原文:C#编写运行在Linux环境下的采用Mediainfo来获取多媒体文件信息的代码项目开始设计的是运行在windows下&#xff0c;所以一开始采用的是windows服务模式来获取多媒体文件信息&#xff0c;后来要求调整为…

如何用chrome扩展将网页变成黑底白字,用以保护视力

不知道有没有科学依据&#xff0c;自己感觉黑底白字对视力好些&#xff0c;于是动手加个chrome扩展&#xff1a; 第一步&#xff1a;建个文件夹&#xff0c;名称比如叫changeColor; 第二步&#xff1a;在changeColor文件夹中建三个文件&#xff1a;manifest.json 、 backgrou…

从零学习机器学习_机器学习:如何从零变英雄

从零学习机器学习以“为什么&#xff1f;”开头 并以“我准备好了&#xff01;”结尾 (Start with “Why?” and end with “I’m ready!”) If your understanding of A.I. and Machine Learning is a big question mark, then this is the blog post for you. Here, I gradu…

sqoop动态分区导入mysql,使用sqoop import从mysql往hive含分区表中导入数据的一些注意事项...

先看下面这条语句&#xff0c;它实现的功能是将特定日期的数据从mysql表中直接导入hive$ sqoop import \--connect jdbc:mysql://192.168.xx.xx:3306/db_name?useSSLfalse \--username xxx --password xxxxxx \--query "select d.id, d.callsign, d.sobt from t_flight_b…

leetcode面试题 08.04. 幂集(递归)

幂集。编写一种方法&#xff0c;返回某集合的所有子集。集合中不包含重复的元素。 说明&#xff1a;解集不能包含重复的子集。 示例: 输入&#xff1a; nums [1,2,3] 输出&#xff1a; [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 代码 class Solution {List&l…

gatsby_我如何使用Gatsby和Netlify建立博客

gatsbyby Pav Sidhu通过帕夫西杜(Pav Sidhu) 我如何使用Gatsby和Netlify建立博客 (How I Built My Blog Using Gatsby and Netlify) 您能说出更具标志性的二人​​组合吗&#xff1f; &#xff1f; (Can you name a more iconic duo? ?) Years ago, whenever I built a stat…