HTTP的安全性问题
我们都知道前后端的通信是通过http协议去进行的,但是http的安全性却得不到保障。比如
- 前后端通信过程使用明文,内容可能会被窃听
- 不验证对方身份,无法保证信息能准确发送给目标
- 通信内容可能被篡改
针对这些问题可由以下方法应对
1.通过加密防止被窃听
(1)通信加密
HTTP中没有加密机制,但可以通过SSL(安全套接层)或TLS(安全传输层协议)的组合使用,加密HTTP的通信内容。
通过使用SSL建立安全通信线路之后,就可以通过这条安全通道进行HTTP通信了,这种HTTP与SSL的组合使用就是HTTPS,所以HTTPS不是一种新的协议,它使用的协议依然是HTTP。
(2)内容加密
另一种防止被窃听的方法是对通信内容进行加密,客户端需要先对需要发送的内容进行加密后再发送,那么服务端想要拿到正确的通信内容的话那么服务端跟客户端都需要具备一样的加密解密机制。
2.验证通信对方身份
在HTTP中,只要服务端收到请求,都会返回一个响应,因此无法确认通信的对方的话会存在以下隐患。
- 客户端无法确定请求是否正确的发送到服务器
- 服务器无法确定响应是否正确返回到正确的客户端
- 对于一些毫无意义的请求也会接收,存在安全性问题,如DOS攻击
HTTP无法确定通信对方,但是使用SSL的话则可以做到这一点,SSL不仅提供加密处理,还提供了一种称为证书的东西,可用于确定对方。
证书是由第三方发布的,可用于证明客户端,服务器是真实存在的,所以可以通过证书确认通信的对方是我们信息发送的目标。
3.防止通信内容被第三方篡改
HTTP无法确认发出的请求/响应和收到的请求/响应前后是相同的。攻击者能够篡改请求和响应,让通信双方看上去通信过程仍是正常的。
加密+认证+信息完整性 = HTTPS
通常HTTP是直接与TCP通信,使用了SSL时则变成先与SSL通信,再由SSL与TCP通信。采用了这层SSL,HTTP就有了加密,证书,保证信息完整性等功能
1.HTTPS是如何交换密钥的
加密和解密都需要用到密钥,没密钥就无法加密解密,反过来任何人持有密钥都能加密解密,如果密钥被攻击者拿到了,那它就失去了意义。那么客户端怎么告诉服务端用什么密钥去解密,又避免被攻击者获取到就成了主要问题。
共享密钥加密
共享密钥加密是指加密和解密都是用一个密钥进行处理,这种方式又叫做对称加密。用这种方法加密的好处是效率比较高,无需多余的处理。但它却有着通信过程中,存在密钥被攻击者获取的风险。
公开密钥加密
公开密钥加密使用一对非对称的密钥,一把私有密钥,一把公开密钥。
私有密钥不能让其他人知道,公开密钥所有人都能知道。
使用这种方式加密,发送密文的一方用对方的公开密钥进行加密,对方收到被加密的信息后,再用自己私有的密钥进行解密。通过这种方式,不需要发送用来解密的私有密钥,也不用担心密钥被攻击者获取。但它也存在一个缺点就是处理速度比较慢。
HTTPS采用混合加密机制
HTTPS为了提高效率,并且保证安全性将以上两种加密方法混合起来使用。先通过公开加密的方式获取到共享密钥加密所需要密钥之后,使用共享密钥加密的方式处理后续通信。
- 客户端向服务端发送报文开始SSL通信。报文包括客户端支持的SSL版本,加密组件列表。
- 服务端可进行SSL通信时,会返回一段报文。包含指定SSL版本与加密组件。这个加密组件是从客户端发送过来的加密组件列表中筛选出来的
- 之后服务端再发送一段报文,包含公开密钥证书,确保客户端能够识别其正确性
- 最后服务端再发送一段报文通知客户端SSL通信结束
- 第一次SSL通信结束后,客户端以Client Key Exchange报文作为回应。包含通信加密中使用的一种Pre-master secret的随机密码串。改密码串是已经用步骤2跟3得到的公开密钥进行加密过的。
- 接着客户端再发送Change Cipher Spec报文。告诉服务端后续通信会用Pre-master secret作为密钥进行加密
- 客户端发送Finished报文,包含连接至今全部的整体校验值。这次协商能否成功取决于服务器能否正确解密该报文
- 服务器像客户端一样发送Change Cipher Spec报文
- 服务器像客户端一样发送Finished报文
- 服务器客户端Finished报文交换完毕后,SSL就算建立成功。后续通信即使用HTTP即可
- 应用层协议通信,即HTTP
至此就是一个HTTPS的工作流程。