最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现。既然不能用https协议,那就退而求其次采用http协议吧!

那么问题来了!在对接的过程中我们需要对如下问题进行相关的考虑:

1、敏感信息的不可见性

  使用http协议传输数据很容易被抓包监听传输内容,如果这些数据中存在敏感信息的话,风险太大了。因此我们需要对我们的传输数据进行一定的加密处理,即使数据被预期接收方之外的其它不法分子拦截,也无法轻易的破译此次请求的传输内容!最简单的方案就是对传输数据使用Base64方法转码,使得数据具备一定的不可读性。当然啦,这种方案实际上是不可取的,因为Base64方案太容易被识别然后解密了。比较常见的做法是,发送方和接收方彼此约定密钥,发送方发送时用密钥对数据加密,接收方用密钥对数据解密。比如AES128加密算法?但是AES128加密也存在局限性,需要定期维护。就算你认为你这方的内部人员是可信的,你也无法无法保证对方的密钥不会泄漏吧。当然聪明的你可能会说,那我就使用非对称加密算法,比如RSA好了。好像是没啥问题?但是如果数据量比较大的话,RSA加密方法对服务器的压力也是很大的。。所以本次结合了AES和RSA来实现我们的数据传输。

2、防止数据被篡改

  用签名!用签名!用签名!重要的事情说三遍?例如:当数据被封装好后,我们可以用md5算法计算出待传输数据的摘要字符串作为签名。当服务器接受到数据后,同样使用md5对数据做摘要,同请求报文中的签名作比较,若不一致则说明该http请求数据已被篡改。但仅仅使用md5对数据作摘要就够了吗?万一攻击方发现了数据签名是用md5做的,攻击方只需要对已篡改的数据再做一次md5,同时更新请求中的签名即可。因此如何生成可靠的签名也需要我们仔细的斟酌。有几点我觉得是需要注意的:1、无法轻易的根据签名推反推出当前签名所采用的算法;2、签名算法的复杂性、可靠性;3、不要直接对传输数据作签名,可以先对请求数据作摘要,再使用加密算法生成签名,既可以提升效率也在一定程度上提高了安全性。

3、http请求的真实性

  有很多方案可以保证http请求的真实性。比如使用token来进行身份验证,可以借鉴微信的身份验证方案或者jwt实现。本次我们只做了简单的处理,在http请求头中设置了一个时间戳,当服务器接收到数据后,会取出http请求中的时间戳,同时与服务器当前时间作比较。若时间间隔过大,则认为该请求是不真实的,直接拒绝并返回!

上面简单的介绍了http传输敏感数据需要注意的地方,本方案具体实现思路如下图所示:

发送方需要干的事

1、生成签名

  • 构造传输对象,并将传输对象转换成json字符串

       本次接口传输采用rest模式作为标准,先构造待传输对象。构造完成后借用Google的Gson包来将对象转换成json字符串。

  • 使用md5算法生成json字符串摘要
  • 使用RSA公钥对摘要字符串作加密处理,生成签名

2、加密请求报文

  发送方创建一个http请求时,需要动态的生成一个AESKey,同时使用该AESKey对请求数据作加密处理。为什么每次请求都需要生成一个新的AESKey呢?主要还是为了防止数据泄漏。如果固定使用相同的Key,万一Key被发送方内部人员泄漏了,其实也对发送数据的加密也就没有意义了。

3、加密AES密钥

  在http请求传递数据时,AES密钥也会被同样传递过去。为了保证AES密钥的安全性,我们采用RSA公钥对AES密钥作加密处理。处理完后会放到Http请求头的Authencation字段中。

4、构造http请求

  • 将第一步生成的签名放到http请求头中的Authencation字段中
  • 将加密后的AES密钥放到http请求头中的SecurityKey字段中
  • 将该请求创建时间放到http请求头中的TimesTamp字段中
  • 将第二步生成的加密报文放到http body中

5、处理http请求结果

  在此之前,请求方和发送方需要约定返回结果的加密方式。发送方接收到http请求返回结果后,通过约定的方式对返回结果进行处理,以供后续使用。这里我们仅简单的约定接收方使用接收到的AES密钥对返回数据作加密后返回即可。

接收方需要干的事

1、请求的真实性校验

  获取http请求头中的TimesTamp字段,同时与系统时间作比较。如果请求时间与当前系统时间间隔在五分钟之内,则认为请求是真实的,反之则认为请求是非法的。

2、获取AES密钥

  从http请求中的SecurtiyKey获取被加密的AES密钥,使用RSA密钥对其解密,获取可供使用的AES密钥

3、获取请求报文

  从httpbody中获取请求报文,使用上面第二步生成的AES密钥解密请求报文

4、验签

  • 对第三步生成的请求报文作md5摘要生成md5Str
  • 获取http请求头中的Authencation字符串,接着使用接收方保存的RSA密钥对其作解密处理获取rsaDecryptStr
  • 比较md5Str和rsaDecryptStr是否一致,若一致则验签通过

5、业务处理

  使用第三步得到的请求报文进行业务处理

6、返回处理结果

  使用第二步获取到的AES密钥对返回结果作加密处理并返回

总结

  本次http请求传输敏感数据方案的实现,上面做了详细的介绍。另外多提一下。在接收方进行验签的时候,我们可以定义一个过滤器来过滤指定http请求。在过滤器中完成验签的工作,以避免在业务处理代码中掺杂验签代码!同时使用过滤器也可以对请求返回结果进行加工处理,在这里就是用AES密钥加密返回结果啦!

出处:http://www.cnblogs.com/cfyrwang/p/8215512.html

基于http协议的加密传输方案的更多相关文章

  1. Python中的端口协议之基于UDP协议的通信传输

    UDP协议: 1.python中基于udp协议的客户端与服务端通信简单过程实现 2.udp协议的一些特点(与tcp协议的比较)        3.利用socketserver模块实现udp传输协议的并 ...

  2. 一种基于http协议的敏感数据传输方案

    最近公司需要通过公网与其它平台完成接口对接,但是基于开发时间和其它因素的考虑,本次对接无法采用https协议实现.既然不能用https协议,那就退而求其次采用http协议吧! 那么问题来了!在对接的过 ...

  3. 网络协议之:加密传输中的NPN和ALPN

    目录 简介 SSL/TLS协议 NPN和ALPN 交互的例子 总结 简介 自从HTTP从1.1升级到了2,一切都变得不同了.虽然HTTP2没有强制说必须使用加密协议进行传输,但是业界的标准包括各大流行 ...

  4. tsunami:一种基于UDP协议的高速传输

    一. 需求 近期在做数据库迁移.常常须要打包实例传输.传统scp感觉非常慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源代码make ...

  5. tsunami:一种基于UDP协议的快速传输

    一. 需求 最近在做数据库迁移,经常需要打包实例传输,传统scp感觉很慢. 二. 软件信息 1. 软件主页:http://tsunami-udp.sf.net/ 2. 软件安装:直接源码make &a ...

  6. vsftpd-基于ftp协议的文件传输服务器软件

    第一部分:在Linux上部署vsftpd服务 1. vsftpd简介 1.1 vsftpd是什么? ftp(File Transfer Protocol)文件传输协议.(实现不同操作系统之间文件的传输 ...

  7. linux下使用vsftp搭建FTP服务器:匿名登录,账号登录,SSL加密传输

    目录 一.关于FTP和VSFTP 二.ftp.sftp.vsftp.vsftpd的区别 三.项目一:搭建一台所有人都可以访问的通用FTP服务器 3.1 项目要求 3.2 项目思路分析 3.3 使用vs ...

  8. 加密传输SSL协议4_综合方案

    隔了那么多天终于有时间继续把这个专题做完了,这次一定连续写完这方面的笔记. 上篇博文说明了非对称加密和对称加密各自的优缺点,那么就很自然的衍生出了一种综合的方案. 两种方案的结合--扬长避短 首先发送 ...

  9. 基于XMPP协议的手机多方多端即时通讯方案

    一.开发背景 1.国际背景 随着Internet技术的高速发展,即时通信已经成为一种广泛使用的通信方式.1996年Mirabilis公司推出了世界上第一个即时通信系统ICQ,不到10年间,即时通信(I ...

随机推荐

  1. hdu5091 线段树

    题意: 给了n个点在平面中 n<10000  然后 将这给了一个 宽为W 高为 H 的 矩形, 然后 使得这个矩形可以 涵盖最多的点有多少个,然后矩形的宽平行x 轴高平行y轴.可以将该矩形 水平 ...

  2. bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm

    P2905 [USACO08OPEN]农场危机Crisis on the Farm 发现总步数$k<=30$,考虑用$k$瞎搞 设$f[u][i][j]$表示已经吹$u$次哨,全体奶牛向右走$i ...

  3. Linux内核分析第五周 扒开系统调用的三层皮(下) (20135304 刘世鹏)

    作者:刘世鹏20135304  <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.给MenuOS增加t ...

  4. IDEA类和方法注释模板设置

    在开发中使用idea的注释总结:由于IDEA自带的注释模板不是太好用,所以整理一下适用于自己的模板: 一.首先我们来设置IDEA中类的模板:(IDEA中在创建类时会自动给添加注释) 1.File--& ...

  5. UVA 11475 Extend to Palindrome(hash)题解

    题意:问你最少加几个字母使所给串变成回文串. 思路:一开始打算将正序和逆序都hash,然后用提取前缀后缀的方法来找,但是RE了,debug失败遂弃之.后来发现可以直接hash,一边hash一边比较.我 ...

  6. HttpClient 4.5.3 get和post请求

    HttpCilent 4.5.3 域名购买.com 后缀好域名 https://mi.aliyun.com/shop/38040 GET请求 CloseableHttpClient httpCilen ...

  7. asp.net和.net的区别

    http://zhidao.baidu.com/link?url=BEIkzsJqo-tnOmWKwzsiuXeohqVJzb_iRCZ5gWCozAGVdw2FSnWW95r3vaUAecUnKsW ...

  8. Windows自带计算器快捷键

    今天乱翻的时候发现了这个东西,下面就是各个快捷键: (以下功能在计算器面板上均能找到) 按键 功能 F9 \(-/+\) R 1/x @ \(\sqrt{}\) Ctrl+Shift+D 清除历史记录 ...

  9. HDU 1556 Color the ball(线段树:区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1556 题意: N个气球,每次[a,b]之间的气球涂一次色,统计每个气球涂色的次数. 思路: 这道题目用树状数组和 ...

  10. Cool Auto-Suggest 插件使用方法

    刚入职的时候公司主管曾经让我用Cool Auto-Suggest 插件写过后台管理页面内的自动填充及搜索功能. 其实这个插件的使用很简单,网上也有相应的翻译文档,但是明显的机翻看着无法忍受.我写一下使 ...