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

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

那么问题来了!在对接的过程当中咱们须要对以下问题进行相关的考虑:json

一、敏感信息的不可见性

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

二、防止数据被篡改

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

三、http请求的真实性

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

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

图片描述

发送方须要干的事

一、生成签名spa

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

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

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

二、加密请求报文
  发送方建立一个http请求时,须要动态的生成一个AESKey,同时使用该AESKey对请求数据做加密处理。为何每次请求都须要生成一个新的AESKey呢?主要仍是为了防止数据泄漏。若是固定使用相同的Key,万一Key被发送方内部人员泄漏了,其实也对发送数据的加密也就没有意义了。code

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

四、构造http请求

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

五、处理http请求结果
  在此以前,请求方和发送方须要约定返回结果的加密方式。发送方接收到http请求返回结果后,经过约定的方式对返回结果进行处理,以供后续使用。这里咱们仅简单的约定接收方使用接收到的AES密钥对返回数据做加密后返回便可。

接收方须要干的事

一、请求的真实性校验
  获取http请求头中的TimesTamp字段,同时与系统时间做比较。若是请求时间与当前系统时间间隔在五分钟以内,则认为请求是真实的,反之则认为请求是非法的。

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

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

四、验签

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

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

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

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

相关文章
相关标签/搜索