[原]App安全二三事

标签: | 发表时间:2018-06-04 18:22 | 作者:x359981514
出处:https://blog.csdn.net/x359981514

首先插播一条自己的广告——有些朋友可能都知道了,我最近创建了一个知识星球,在这里试了一周,发现私密圈子的效率果然比群要好很多,付费门槛过滤掉了大部分广告和没有意愿学习分享的人,希望在这里能聚集更多的热爱学习热爱分享的朋友,长按下面的二维码来加入《程序员修仙指南》

这里写图片描述

App安全二三事

客户端防作弊,是一个很重要,但又很难做好的事情,矛与盾永远是道高一尺,魔高一丈。

为什么要安全

现在几乎所有App都是网络强相关的,客户端展示的很多东西都是通过接口从服务器上获取的,当然,服务器也会接收大量从客户端上传的数据,这两端在进行双向通信的时候,就很容易被第三方截获,导致数据被盗取、接口被盗刷。

App的移动安全主要包括下面几种:

  1. 密钥破解,导致本地加密数据被盗取
  2. 通信密钥破解,导致接口数据被盗取
  3. 伪造接口数据上报
  4. 接口签名被破解,导致接口可以被重放攻击

那么归结起来,实际上就是这样几种模式:

  1. 代码反编译
  2. so破解
  3. 中间人攻击

用户要的安全

对于用户来说,他所需要的安全,是自己的敏感数据不被泄漏,不被第三方所知晓,所以,客户端数据的安全,一般会使用加密的方式来保证安全,但数据既然存在本地,那么自然既需要加密,也需要解密(如果不需要解密,那么也就没有保留的必要了),所以,本地就一定会有加解密的密钥,那么为了保证这个密钥的安全,本地代码又需要进行加密,这样突然好像就进入了一个死循环,成了一个鸡生蛋,蛋生鸡的问题,这也是为什么『本地没有绝对的安全』这样一说的原因。

本地加密

本地的加密,我们通常从混淆——proguard入手,这是最简单的加密,成本最低,而且可以比较有效的扼杀一些在破解边缘徘徊的初级破解者,让他们能够悬崖勒马,浪子回头,然而,对于真正想要破解的人来说,混淆只等于加大了一点阅读难度而已,相信做开发的同学基本上也都反编译过别人家的App,通过像jadx、apktool、dex2jar这样的反编译工具,可以非常方便的找到破解的蛛丝马迹,特别像jadx这样的反编译神器,直接导出gradle工程去AS里面查看代码,简直不要太舒服。

再高级一点,我们通过Dexguard、各种第三方so加固服务、加壳服务等方式来进行保护,这些方式的确会极大的增加破解者的破解成本,到对于主流的加固技术,相应的破解技术也是非常成熟的,所以说,虽然技术很牛逼,但只要破解者知道了你加固的方式,就可以轻而易举的找到破解的方法,也就是比proguard多了一次Google的过程。

说完了这些代码的安全,我们再来看看密钥的安全问题,前面说了,密钥一定会『藏』在本地。

最低级的,密钥被直接放在Java代码中,这种基本上就是为了糊弄老板的,稍微高级点的,也放在Java代码中,但是并不是直接让你找到的,为了增加自己的一点信心,他会把密钥拆成几个部分,然后通过一定算法计算合成完整的密钥,自欺欺人罢了,再高级一点,会把密钥和加解密放so中,再进一步,同样将密钥打散,通过一定算法进行组装,再高级一点,so再做下签名校验,加个花指令,甚至是一些人肉混淆(1、I、l),一步步的,过滤了一批批小白、初级、中级、高级破解者,然而,天下无利不往,如果你的App真的有这样的价值,那也一定会吸引那些骨灰破解者,毕竟人怕出名猪怕壮。

当然Google也总是后知后觉,在各种厂商提供了TrustZone/TEE硬件加密方案后,Google也推出了Keystore,当然,最低要API26才能使用,所以在现在来说,几乎不会有App能做到最低版本26,也就没办法借助Keystore来进行安全存储了。

接口签名

接口上的安全,最基本的保证就是Https,同时对SSL协议的域名进行校验(关键词:X509TrustManager、hostnameVerifier),相信大部分的开发者都没有对这两个地方进行校验,在此之上,请求的接口上,我们一般会带上一个签名,或者叫token,这个加密的密钥串,就是我们身份的象征,一般来说,这个签名也就是通过前面我们千辛万苦要藏好的本地密钥来进行生成的,通常也就是那几个参数,例如时间戳、UserID、IMEI、Mac地址等等进行拼装,然后通过DES、3DES、AES、hmacSHA1等方式进行加密后,再经过Base64进行编码生成的,这些加密过程就不赘述了,反正大家的都不一样,根据关键词大家去Google下就好了。

服务端要的安全

服务端需要的安全,主要是希望收到的请求,都真实的来自正常用户的正常触发。

但客户端在由不受信第三方(比如用户)控制的情况下,基本不存在能够验证请求是来自“自己的”客户端的方法,只能通过以下两种方式来增加破解者的破解成本。

  • 本地秘钥+算法,用于生成接口签名,难点在于如何保证本地秘钥和算法的安全性,也就是我们前面说的
  • 动态秘钥,将密钥的生成放在服务端,难点在于如何保证通信协议的安全性,同时也需要本地密钥来保证请求动态密钥的接口安全

动态秘钥下发的方案,需要在保证通信协议安全的情况下,才有实现价值,例如某活动页面的刷榜,可以增加一个前置依赖接口用于动态返回秘钥,客户端使用该动态秘钥来进行活动页面的请求,秘钥不存本地,每次请求都是新的秘钥,设置网络请求框架的NO_PROXY模式,就是一个最简单的方案。

考虑到服务器设备的安全性,目前主流的防作弊检测都是在服务端进行,当然最主要的原因还是本地根本没办法保证绝对的安全。

识别用户请求链路

根据必要的API调用流程和闭环,限制一组API调用中不同个体API相对于其它API的调用频率(相对次数)限制。设定几个隐秘的参数关联逻辑,是跟业务逻辑环环相扣的,如果其他人想要自己拼装参数,往往会打破这个隐秘约束。

但这个检测通常需要耗费一定的系统资源,同时,当业务比较复杂的时候,如何保证请求检测的实时性和高效性,就成了一个很难平衡的问题。

网关层拦截、人机识别

  • 网关层拦截同IP的大量重复请求,设置同IP访问的阈值。
  • 大数据识别,对识别为恶意请求的进行封号处理

这是目前比较主流的做法。

TCP加密

目前大部分的App都是通过Http来进行数据交互,但基于TCP,我们可以实现自己的通信协议,另外,利用TCP包的无序性来增加破解的难度,这样,利用TCP心跳来维持一个安全的通信通道,也是一个非常不错的方案,不过操作难度比较大。

修改业务逻辑处理方式

在设计业务技术实现方案时,将业务判断逻辑放在后端,客户端只做指令上发,判断是否生效,在服务端进行判断。

后现代安全

量子加密、白盒加密、人工智能分析,这些基本都是下一代的安全策略,就当前来说,还比较虚幻,不过只要技术一旦成熟,一定将是划时代的里程碑。

另外,知识星球是可以通过分享来获取奖励的,在『程序员修仙智能』中,点击左上角可以进行分享界面,选择分享星球即可拿到自己的奖励。

这里写图片描述

作者:x359981514 发表于 2018/06/04 18:22:33 原文链接 https://blog.csdn.net/x359981514/article/details/80556224
阅读:9

相关 [app 安全] 推荐:

[原]App安全二三事

- - eclipse_xu
首先插播一条自己的广告——有些朋友可能都知道了,我最近创建了一个知识星球,在这里试了一周,发现私密圈子的效率果然比群要好很多,付费门槛过滤掉了大部分广告和没有意愿学习分享的人,希望在这里能聚集更多的热爱学习热爱分享的朋友,长按下面的二维码来加入《程序员修仙指南》. 客户端防作弊,是一个很重要,但又很难做好的事情,矛与盾永远是道高一尺,魔高一丈.

Android APP安全测试基础

- - 阿德马Web安全
自从去了新公司之后,工作太忙,变的有点懒了,很久没有更新Blog. 今天跟几个小伙伴一起吃饭,小伙伴提起我的Blog,想想是该更新更新了,就把我投稿给sobug的这篇转过来吧,关于Android app安全测试的基础东东,在Sobug 的url:. 最近这两年移动端真是非常火,每个单位或多或少都会有那么几款App,对于我们Web安全攻城师来说,App安全也需要或多或少的了解一些.

iOS平台个人网银APP的安全测试报告

- - FreeBuf.COM | 关注黑客与极客
几年来,我一直在从事有关个人网银APP的安全性研究. 在这份报告中,我使用了黑盒和静态分析的方法,对全球最具影响力的四十个iPhone/ipad网银APP进行了安全测试. 以下国家的个人网银APP被纳入测试. 本研究在40小时内(不连续)完成. 为了保护这些应用程序的所有者及其用户,本研究没有公布发现的漏洞以及利用它们的方法.

从安全和体验上解析移动App的登录

- - CSDN博客推荐文章
App登录需要解决的问题有两个:安全、体验. 它们分别对应着登录过程的用户认证,以及用户登录过程操作复杂度两个问题. 一、登录过程的用户认证,常见的手段有密码加密传输、动态密码、验证码等. 目前互联网行业的移动APP有不少在使用最简单的做法:根据密码生成一个散列值,把散列值发送给服务器. 服务器计算库中用户密码的散列值,然后和客户端传来的散列值比较,一致的话,登录成功.

移动安全:android app proguard混淆配置与常见问题

- - Seay's blog 网络安全博客
Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到. 为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难.

Android应用安全开发之浅谈网页打开APP

- - WooYun知识库
Author:伊樵,呆狐,舟海@阿里移动安全. 0x00 网页打开APP简介. Android有一个特性,可以通过点击网页内的某个链接打开APP,或者在其他APP中通过点击某个链接打开另外一个APP(AppLink),一些用户量比较大的APP,已经通过发布其AppLink SDK,开发者需要申请相应的资格,配置相关内容才能使用.

APP 缓存数据线程安全问题探讨

- - bang’s blog
一般一个 iOS APP 做的事就是:请求数据->保存数据->展示数据,一般用 Sqlite 作为持久存储层,保存从网络拉取的数据,下次读取可以直接从 Sqlite DB 读取. 我们先忽略从网络请求数据这一环节,假设数据已经保存在 DB 里,那我们要做的事就是,ViewController 从 DB 取数据,再传给 view 渲染:.

[原]17.app后端如何保证通讯安全--aes对称加密

- - 曾健生的专栏
在上文《16.app后端如何保证通讯安全--url签名》提到,url签名有两个缺点,这两个缺点,如果使用对称加密方法的话,则完全可以避免这两个缺点. 在本文中,会介绍对称加密的具体原理,和详细的方案,使app通讯更加安全.   采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密.

App 和 iCloud

- 笑炊 - 爱范儿 · Beats of Bits
iCloud 的技术细节还在 NDA 的保护下. 但是大家的好奇心不能等到 NDA 失效再满足. 本文基于对 iCloud 的猜测写成,靠谱与否,等待时间检验. 打开浏览器,嗯,今天用 Safari , Chrome , IE 或者 Firefox. 输入 Twiter.com ,啊,不对,是 Twitter.com.

App Internet 革命

- Cary - Mr. Jamie 看網路與創投
Apple 公布最新一季的財報,3 個月賣出了破紀錄的 3,500 萬台 iDevices (iPhone, iPad & iPods). Google 公布最新數字,全球有 1.9 億支 Android 已經被啟用. 大家很興奮「智慧型手機」、「行動裝置」革命終於來到,我卻隱隱感覺到另一件更重大的事情正在發生,我們所熟知的「網路」,即將經歷另一次大幅度的轉變.