Retrofit/Okhttp API接口加固技术实践(上)

作者:Tamic

地址:http://blog.csdn.net/sk719887916/article/details/61914609

写这篇文章,我纠结了很久,到底是属于app安全系列,还是属于Retrofit系列,最终我还是选择了将本篇文章归类到Retrofit下。

对于retrofit安全相关的刚开始就写了一篇《Retrofit 2.0 超能实践(一),okHttp完美支持Https传输》(http://blog.csdn.net/sk719887916/article/details/51597816, 文章介绍了怎么使用Retrofit,并且在遇到okhttps的使用方式,但对于加密我们还是无法了解太多,对于安全性要求很高的接口场景还是无法满足,今天就来介绍下对普通api参数的加密!

APP基本安全的文章以前撸了一篇App安全(一) Android防止升级过程被劫持和换包,后续没有再继续跟进,今年会加重安全这块的文章。 主要说下支付宝为代表的用的安全策略技术,本篇介绍下API加固的常用技术。常用的模式是加密-认证身份-鉴别权限-解密过程。

Api加固除了本身支持Https,还会额外进行上图中一系列的加密策略,自定义对Resquest/Response Data进行加密,对url加密,甚至对request进行校验等。如果你加入RxJava操作符做一系列的加密流程,那将是锦上添花。解密过程也直接使用RxJava ,map操作符转换解密后返回给业务层,RxJava之前也介绍过好几篇,这里不再安利。

加固API主要由四种方案:

  • 使用Https
  • URL加密
  • 参数加密
  • 加入权限
  • 时效验证
  • 数字签名

Https

以前写过一篇文章可以参考 :Retrofit 2.0 超能实践(一),完美支持加密Https传输

URL加密

只针对普通get请求,不针对post表单提交及ajax方式

策略:对于暴露在浏览器地址栏中的地址进行加密,如一个属性为name=tamic,

假设对tamic加密后为kadfxarf24saa:

假设真实值在这段字符中间,那么我们可以对前三位进行随机,后三位随机,

再对真实的tamic进行加密转换(base64都行),然后再来个倒序,那么剩下的数字我们可以获取当前时间追加,最后再进行md5都行,这样普通的用户无法感知具体路径真实值是什么,甚至一般黑客都无法轻易解析具体内容,服务端拿到具体值的策略也是一样

只要按约定的好的算法进行解码就行了。这样不仅能防止恶意程序请求我们的服务端。而且还能对具体的参数地址进行加密。

参数加密

参数加密一般针对表单中的字段和值进行加密,防止中途第三方进行窥探和篡改。一般我们可以用okhttp的Interceptor 进行处理。 可以在发动报文前,对参数进行加密转码。

案列:

public class EncryptionInterceptor implements Interceptor {

  private static final String TAG = EncryptionInterceptor.class.getSimpleName();

  private static final boolean DEBUG = true;

   @Override
   public Response intercept(Chain chain) throws IOException {

   Request request = chain.request();
   RequestBody oldBody = request.body();
   Buffer buffer = new Buffer();
   oldBody.writeTo(buffer);
   String strOldBody = buffer.readUtf8();
   MediaType mediaType = MediaType.parse("text/plain; charset=utf-8");
   String strNewBody = CodeMachine.encrypt(strOldBody);
   RequestBody body = RequestBody.create(mediaType, strNewBody);
   request = request.newBuilder().header("Content-Type", body.contentType().toString()).header("Content-Length", String.valueOf(body.contentLength())).method(request.method(), body).build();
   return chain.proceed(request);
}}

加密算法自己和服务端约定即可

private static String encrypt(String ){
  //your code
}

add到client即可

client = new OkHttpClient.Builder()
.addNetworkInterceptor(new  EncryptionInterceptor()).build();
retrofit = new Retrofit.Builder().client(client).build();

服务端代码也是拿到具体参数进行同步的加密算法来进行反解密。

加入权限

权限控制也是对接口加密的一种业务层策略,比如一个电商APP,有商户,有用户,有中间物流商,还有中间服务商,那么同一个获取商品信息的权限不同的,商家有修改商品信息的权限,用户只能浏览查看的功能,物流商可以有指定物流渠道权限,中间服务商可以拥有协调监督功能,如归有涉及假冒,法律的可以强制下架改商品,那么是同样一个getProductInfo接口 却又不同的信息,那么这个接口定义的时候,服务端和移动端就已经商讨好了协议,赋予不同角色权限.

 public enum Permission {

  User,
  Shop,
  Courier,
  Platform
}

如上展示了四种角色控制,不同角色Server返回的数据Module也是不同的。 遇到三方恶意攻击,服务端确定并客户端发来的权限并不是我们固定的角色,那么服务端也将视这次请求为无效的。

时效验证

时效验证一般是用来校验API是否过期,业内常用来做订单是否重复的依据之一。比如用户在某个购物网站下单买东西时,就会生成下单的时间毫秒数,服务端拿到这个下单(Request)动作的网络请求,会检验这个时间是否过期,如果时间差值大于规定的值,就可视这个订单被中途篡改过,或者过期,比如一秒内重复从一个客户端发两个请求(Request),服务端(server)拿到时间发现已经存在一个,就不再处理第二个订单信息,提示用户不要重复提交。

一般时间值参数,不会单纯的在请求中单一传输,一般采用某种算法把客户端的时间戳 加密成一定字符后,在进行发送到SERVICE.这种策略对于重复恶意刷单,有很好的防御作用。支付宝付款实则也是用的这种策略,时间阀值大约3s左右。

数字签名

每个Request也应该有响应的数字签名,这个签名不同于SSL机制的中的签名,只是Client和server约定的一种自签名方式,额外校验Request数据有没有被篡改过,也可以称之为每个Request有一定的唯一区分符-ID,签名算法可能很复杂,一般依据本地设备ID,UserID,UUID,Token,综合进行计算,本质其实就是加密,附带给Request。

总结

通过以上Retrofit的api加密列子。在客户端api加固中,常用上面这几种综合来实现,做到万无一失,从数据源的加密,到传输过程中加密,到数据源获取到权限的校验,整个过程都是做了防御的,这种思维我们可以参考:OAuth 工作原理,那么很多时候我们也要对服务端返回的数据进行校验,后续带来对response反校验一文。

阅读推荐

App安全(一) Android防止升级过程被劫持和换包H

原文:http://blog.csdn.net/sk719887916/article/details/61914609

第一时间获取技术文章请关注公众号!

时间: 2024-10-13 20:23:39

Retrofit/Okhttp API接口加固技术实践(上)的相关文章

Retrofit/OkHttp API接口加固技术实践(下)

作者/Tamic http://blog.csdn.net/sk719887916/article/details/65448628 上节加固介绍了APi单纯Post用对称加密(Base64 为列子)加密方式,这种加密方式还是存在一定的风险,加密效率虽高,但易破解,本节将介绍怎么用非对称加密 来加解密okhttp的数据,本文采用RSA加密算法为栗子. 对称加密 对称加密是最传统的加密方式,比上非对称加密,缺少安全性,但是它依旧是用的比较多的加密方法. 对称加密采用单密钥加密方式,不论是加密还是解

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

atitit.基于http json api 接口设计 最佳实践 总结o7

atitit.基于http  json  api 接口设计 最佳实践 总结o7 1. 需求:::serverand android 端接口通讯 2 2. 接口开发的要点 2 2.1. 普通參数 meth,param, 2 2.2. 全部的參数定义 2 2.3. key,dynami key)韩式 static key? 2 2.4. 防篡改 sign 2 2.5. Encry加密 3 2.6. zip压缩:: 3 2.7. 首先压缩韩式加密??? 3 3. 选型大全:rim ,ws, http 

APP加固技术历程及未来级别方案:虚机源码保护

传统App加固技术,前后经历了四代技术变更,保护级别每一代都有所提升,但其固有的安全缺陷和兼容性问题始终未能得到解决.而下一代加固技术-虚机源码保护,适用代码类型更广泛,App保护级别更高,兼容性更强,堪称未来级别的保护方案. (加固技术发展历程) 第一代加固技术-动态加载 第一代Android加固技术用于保护应用的逻辑不被逆向与分析,最早普遍在恶意软件中使用,其主要基于Java虚拟机提供的动态加载技术. 其保护流程是: 开发阶段中将程序切分成加载(Loader)与关键逻辑(Payload)两部

一步一步学swift之:自己写Api接口-PHP

想要自己一个人完成app,那么后台接口也必须自己动动手.不用担心,其实很简单的,给自己信心!下面就以登录注册为例,做一个api接口 首先在mac上搭建PHP环境,下载 MAMP Pro for Mac 3.4 破解版: http://www.ifunmac.com/2015/08/mamp-pro-3-4/即可一键安装Apache/PHP/MySQL开发环境.简单吧. 有了环境就可以写代码了: 首先写一个Config.php (配置数据库) 1 <?php 2 3 //定义数据库连接所需的变量

利用Metaweblog技术的API接口同步到多个博客网站(详细)

很早就有这个想法:自己有时候会用到多个博客,有些博客在一个网站上写完之后,要同步到其他博客网站,自己只能复制粘贴,感觉特别没意思,复制粘贴的麻木了.一直在想有哪些技术能实现一次写博,多站同步.最近网上搜了下,还真有这方面的资料,那就是用Metaweblog的API接口,这种特别像foxmail一样能把多个邮箱都集中在一起管理来收发邮件,Metaweblog能一次把写的博客同步到多个博客. 直接用Metaweblog来实现同步功能不太方便,幸好有了Windows live writer这个实现了M

身份证/行驶证/驾驶证识别SDK及API接口技术

一.身份证/行驶证/驾驶证识别SDK及API接口技术应用背景 这些年,随着移动互联网的的发展,越来越多的公司都推出了自己的移动APP,这些APP多数都涉及到个人身份证信息的输入认证(即实名认证),如果手动去输入身份证号码和姓名,速度非常慢,且用户体验非常差.为了提高在移动终端上输入身份证信息的速度和准确性,我们开发出证件识别:身份证/行驶证/驾驶证识别SDK及API接口技术,以满足各行业应用需求,给用户带来更好的体验.只需将证件识别:身份证/行驶证/驾驶证识别SDK及API接口技术集成到APP中

服务上亿用户,中国结算新一代数据集市技术实践

作者介绍: 卢向澄 金融科技领域十余年工作经验,目前在中国证券登记结算公司从事技术架构工作,专注于技术中台.云平台.大数据平台等领域. 1. 背景介绍 我国股市约有1.2亿散户,直接关乎上亿家庭.数亿人切身利益,保护好投资者尤其是中小投资者的合法权益,是资本市场工作人民性的具体体现,也是服务实体经济的应有之义.党的十九大明确提出"必须坚持以人民为中心的发展思想".中国证监会有关负责人表示,要认真贯彻落实十九大精神和党中央.国务院关于资本市场建设的一系列决策部署,加快推动形成融资功能完备

WEB API接口的实现——常熟电视台全媒体技术开发

全媒体技术开发及运维业务考试大纲 一.笔试理论题: 1.公共基础知识(时政.相关法律法规等) 2.网络基础知识(路由.交换.TCPIP协议.常用端口号等) 3.云技术基础知识(阿里云.腾讯云等云产品应用) 4.H5开发基础知识(HTML.JS.CSS等) 5.安卓端开发基础知识(JAVA.UI组件等) 6.IOS端开发基础知识(OC.Swift.UI组件等) 7.后端开发基础知识(运行环境配置.数据库操作等) 8.硬件开发基础知识(单片机.FPGA.AD软件等) 9.项目案例分析设计(项目设想.