关于web安全开发之摘要认证

为什么需要认证

经由 HTTP 协议进行通信的数据大都是未经加密的明文,包括请求参数、返回值、cookie、 head 等数据,因此,外界通过对通信的监听,便可轻而易举地根据请求和响应双方的格式,伪造诸求与响应,修改和窃取各种信息。相对于基千 TCP 协议层面的通信方式,针对 HTTP协议的攻击门槛更低。因此,基于HTTP协议的Web与SOA架构,在应用的安全性方面需要更加重视。经由浏览器的访问请求,可以通过浏览器插件进行网络监听,以及查看传输的网络参数。比如chrome浏览器,可以按F12去打开插件或者右击选择检查。
如图

通过插件,可以清楚地看到HTTP请求所生成的任何参数及响应的body信息,这些数据如没有特殊处理,都是未经加密的明文,包括用户的用户名与密码。当然,浏览器插件大多数情况下只能看到本机浏览的信息。

更为危险的事情是,攻击者可以通过对一 些网络核心节点的控制,再加上一 些特殊的手段如端口映射、代理监听等,使其能够监听和拦截到大量用户的通信数据包,通过对数据包进行筛选和分析,可以得到通信所涵盖的用户的所有敏感信息,如电子邮件、聊天记录甚至是登录的用户名和密码。

由此可见,获取网络中HTTP协议通信的细节并非十分困难的事情。为了防止在通信的过程中,数据被中途拦截和修改,或者虚假的客户端冒充正常的客户端发起请求,非法与服务端进行通信,获取数据,再或者是客户端与虚假的服务端进行通信,将个人信息泄露给恶意的攻击者,需要对请求和响应的参数及客户端的身份或服务端的身份进行认证,以保证正确信息发送给了合法的接收者。

总结: 因为网络请求一般是Http请求,HTTP协议进行通信的数据大都是未经加密的明文,包括请求参数、返回值、cookie、 head 等数据,因此,外界通过对通信的监听可以获取很多信息,并修改。是不安全的。

摘要认证的原理

鉴于使用HTTPS性能上的成本以及需要额外申请 CA 证书,在这种情况下,一 般采用对参数和响应进行摘要的方法,即能够满足需求。

针对每次请求和响应,按照一 定的规则生成数字摘要,数字摘要需要涵盖客户端与服务端通信的内容,以及双方约定好的盐值以此来保障请求与响应不被第三方篡改。常见的摘要算法包括MDS、SHA等关于摘要算法的介绍。我这篇文章已经讲解过了:
https://www.jianshu.com/p/cfa1b5bc5b27

由于传递端和接收端都认为HTTP协议的请求参数是无序的,因此客户端与服务端双方约定好参数的排序方式。请求的参数经过排序后,再将参数名称和值经过一 定的策略组织起来,加上一个密钥 secret , 也就是所谓的 “盐", 然后通过约定的摘要算法生成数宁摘要,传递给服务端。

在服务端接收到客户端传递的参数后,服务端会采用与客户端相同的策略对参数进行排序,并且加上相同的secret, 采用相同的摘要方式生成摘要串。由于相同内容经过相同的摘要算法,生成的摘要内容必定是相同的。将服务端生成的摘要串与客户端生成摘要串进行比较,这样可以得知参数内容是否被篡改。

同样的,服务端返回的响应也需要加上secret, 采用约定好的摘要算法生成相应的摘要,并将生成的摘要作为响应的一 部分,返回给客户端,以便验证服务端返回数据的合法性。

当客户端接收到服务端的响应后,加上相同的secret进行拼接,并采用与服务端相同的摘要算法进行摘要,生成的摘要串与服务端传递过来的摘要串进行比较,这样便可得知服务端的响应是否被篡改。

由于摘要算法的不可逆性,并且大部分情况下不同的请求参数会有不同的服务端响应,鉴于参数和响应的多变性,摘要认证这种方式能够在一 定程度上防止信息被篡改,保障通信的安全。

但是,摘要认证的安全性取决于secret的安全性,由于服务端与客户端采用的是相同的secret,一 旦 secret泄露,通信的安全则无法保障。

摘要认证的实现
实现起来主要包含如下四个方面:客户端参数摘要生成、服务端参数摘要校验、服务端响应摘要生成和客户端响应摘要校验。

  1. 客户端参数摘要生成



    请求的参数需要先排好序,服务端与客户端需要事先约定好排序的方式。排好序后,将参数名称与参数值串起来,加上约定好的secret, 生成待摘要的字符串,最后使用如MD5之类的摘要算法生成摘要串。当然,摘要算法也需要事先约定好。

2服务端参数摘要校验

服务端接收到请求的参数后,按照与客户端相同的方式将参数排序,然后将参数的名称与参数的值串起来,生成待摘要字符串,并且使用与客户端相同的摘要算法生成摘要串,最后将服务端生成的摘耍串与客户端通过header或者其他形式传递过来的摘要串进行比较,如果一致,表示参数没有遭到篡改,反之则说明参数遭到篡改。




params为服务端接收到的客户端传递过来的参数Map, digest为客户端参数的签名,服力端通过将参数名称放入TreeSet排序,能够取得跟客户端一 样的参数顺序,将排好序的参数组 口起来,生成摘要,与客户端传递的摘要对比,便可得知消息是否被篡改。

  1. 服务端响应摘要生成

服务端生成响应内容以后,在响应内容的后面加上secret,便是待摘要串,然后使用MD5等摘要算法生成响应的摘要串。




content为服务端响应的JSON数据或者HTML文本数据,生成摘要后,为了方便互联网传输,使用Base64对摘要数据进行编码。

4客户端响应摘要校验

客户端接收到服务端的响应内容后,在响应内容的后面加上secret,便成为待摘要串,然后通过MD5等摘要算法的计算来生成对应的响应摘要,与服务端通过header等方式传递回来的摘要串进行比较,如果一致,表示响应没有被继改,反之则说明参数遭到篡改。

responseContent 为客户端收到的服务端响应,digest为服务端传递过来的摘要信息,通过客户端进行计算,便可得知服务端响应是否被篡改。

摘自:
《大型分布式网站架构设计与实践》 阅读笔记

你可能感兴趣的:(关于web安全开发之摘要认证)