这组标签。第二种:需要给okhttpClient配置X509TrustManager来监听校验服务端证书有效性。遍历设备上信任的证书,通过证书别名将用户证书(别名中含有user字段)过滤掉,只将系统证书添加到验证列表中。该方案优点和缺点分析说明优点:network_security_config配置简单,对整个app网络生效,无需修改代码;代码实现对通过该网络框架请求的生效,能兼容7.0以前系统。缺陷:network_security_config配置方式,7.0以前的系统配置不生效,依然可以通过代理工具进行抓包。okhttp配置的方式只能对使用该网络框架进行数据传输的接口生效,并不能对整个app生效。破解:将手机进行root,然后将代理证书放置到系统证书列表内,就可以绕过代码或配置检查了。4.2关闭代理charles和fiddler都使用代理来进行抓包,对网络客户端使用无代理模式即可防止抓包,如OkHttpClient.Builder().proxy(Proxy.NO_PROXY).build()no_proxy实际上就是type属性为direct的一个proxy对象,这个type有三种direct,http,socks。这样因为是直连,所以不走代理。所以charles等工具就抓不到包了,这样一定程度上保证了数据的安全,这种方式只是通过代理抓不到包。通常情况下上述的办法有用,但是无法防住使用VPN导流进行的抓包使用VPN抓包的原理是,先将手机请求导到VPN,再对VPN的网络进行Charles的代理,绕过了对App的代理。该方案优点和缺点分析说明优点:实现简单方便,无系统版本兼容问题。缺陷:该方案比较粗暴,将一切代理都切断了,对于有合理诉求需要使用网络代理的场景无法满足。破解:使用ProxyDroid全局代理工具通过iptables对请求进行强制转发,可以有效绕过代理检测。4.3证书校验(单向认证)下载服务器端公钥证书为了防止上面方案可能导致的“中间人攻击”,可以下载服务器端公钥证书,然后将公钥证书编译到Android应用中一般在assets文件夹保存,由应用在交互过程中去验证证书的合法性。如何设置证书校验通过OkHttp的API方法sslSocketFactory(sslSocketFactory,trustManager)设置SSL证书校验。如何设置域名合法性校验通过OkHttp的API方法hostnameVerifier(hostnameVerifier)设置域名合法性校验。证书校验的原理分析按CA证书去验证的,若不是CA可信任的证书,则无法通过验证。单向认证流程图image该方案优点和缺点分析说明优点:安全性比较高,单向认证校验证书在代码中是方便的,安全性相对较高。缺陷:CA证书存在过期的问题,证书升级。破解:证书锁定破解比较复杂,比如老牌的JustTrustMe插件,通过hook各网络框架的证书校验方法,替换原有逻辑,使校验失效。4.4双向认证什么叫做双向认证SSL/TLS协议提供了双向认证的功能,即除了Client需要校验Server的真实性,Server也需要校验Client的真实性。双向认证的原理双向认证需要Server支持,Client必须内置一套公钥证书+私钥。在SSL/TLS握手过程中,Server端会向Client端请求证书,Client端必须将内置的公钥证书发给Server,Server验证公钥证书的真实性。用于双向认证的公钥证书和私钥代表了Client端身份,所以其是隐秘的,一般都是用.p12或者.bks文件+密钥进行存放。代码层面如何做双向认证双向校验就是自定义生成客户端证书,保存在服务端和客户端,当客户端发起请求时在服务端也校验客户端的证书合法性,如果不是可信任的客户端发送的请求,则拒绝响应。服务端根据自身使用语言和网络框架配置相应证书校验机制即可。双向认证流程图image该方案优点和缺点分析说明优点:安全性非常高,使用三方工具不易破解。缺陷:服务端需要存储客户端证书,一般服务端会对应多个客户端,就需要分别存储和校验客户端证书,增加校验成本,降低响应速度。该方案比较适合对安全等级要求比较高的业务(如金融类业务)。破解:由于在服务端也做校验,在服务端安全的情况下很难被攻破。4.5防止挂载抓包Xposed是一个牛逼的黑科技Xposed+JustTrustMe可以破解绕过校验CA证书。那么这样CA证书的校验就形同虚设了,对App的危险性也很大。App多开运行在多个环境上多开App的原理类似,都是以新进程运行被多开的App,并hook各类系统函数,使被多开的App认为自己是一个正常的App在运行。一种是从多开App中直接加载被多开的App,如平行空间、VirtualApp等,另一种是让用户新安装一个App,但这个App本质上就是一个壳,用来加载被多开的App。VirtualApp是一个牛逼的黑科技它破坏了Android系统本身的隔离措施,可以进行免roothook和其他黑科技操作,你可以用这个做很多在原来APP里做不到事情,于此同时VirtualApp的安全威胁也不言而喻。如何判断是否具有Xposed环境第一种方式:获取当前设备所有运行的APP,根据安装包名对应用进行检测判断是否有Xposed环境。第二种方式:通过自造异常来检测堆栈信息,判断异常堆栈中是否包含Xposed等字符串。第三种方式:通过ClassLoader检查是否已经加载了XposedBridge类和XposedHelpers类来检测。第四种方式:获取DEX加载列表,判断其中是否包含XposedBridge.jar等字符串。第五种方式:检测Xposed相关文件,通过读取/proc/self/maps文件,查找Xposed相关jar或者so文件来检测。如何判断是否是双开环境第一种方式:通过检测app私有目录,多开后的应用路径会包含多开软件的包名。还有一种思路遍历应用列表如果出现同样的包名,则被认为双开了。第二种方式:如果同一uid下有两个进程对应的包名,在"/data/data"下有两个私有目录,则该应用被多开了。判断了具有xposed或者多开环境怎么处理App目前使用VirtualApp挂载,或者Xposed黑科技去hook,前期可以先用埋点统计。测试学而思App发现挂载在VA上是推出App。4.5数据加解密针对数据加解密入口目前在网络请求类里添加拦截器,然后在拦截器中处理request请求和response响应数据的加密和解密操作。主要是加密什么数据在request请求数据阶段,如果是get请求加密url数据,如果是post请求则加密url数据和requestBody数据。在response响应数据阶段,如何进行加密:发起请求(加密)第一步:获取请求的数据。主要是获取请求url和requestBody,这一块需要对数据一块处理。第二步:对请求数据进行加密。采用RC4加密数据第三步:根据不同的请求方式构造新的request。使用key和result生成新的RequestBody发起网络请求如何进行解密:接收返回(解密)第一步:常规解析得到result,然后使用RC4工具,传入key去解密数据得到解密后的字符串第二步:将解密的字符串组装成ResponseBody数据传入到body对象中第三步:利用response对象去构造新的response,然后最后返回给App4.7证书锁定证书锁定是Google官方比较推荐的一种校验方式原理是在客户端中预先设置好证书信息,握手时与服务端返回的证书进行比较,以确保证书的真实性和有效性。如何实现证书锁定有两种实现方式:一种通过network_security_config.xml配置,另一种通过代码设置;//第一种方式:配置文件