HTTP和HTTPS的安全性
1. HTTP协议为什么是不安全的
HTTP协议属于明文传输协议,交互过程以及数据传输都没有进行加密,通信双方也没有进行任何认证,因此通信过程非常容易遭遇劫持、监听、篡改。严重情况下,会造成恶意的流量劫持、个人隐私泄露(比如银行卡卡号和密码泄露)等严重的安全问题。
可以把HTTP通信比喻成寄送信件一样,A给B寄信,信件在寄送过程中,会经过很多的邮递员之手,他们可以拆开信读取里面的内容(因为HTTP是明文传输的)。A的信件里面的任何内容(包括各类账号和密码)都会被轻易窃取。除此之外,邮递员们还可以伪造或者修改信件的内容,导致B接收到的信件内容是假的。
这边举例几个HTTP通信不安全的列子:在HTTP通信过程中,“中间人”将广告链接嵌入到服务器发给用户的HTTP报文里,导致用户界面出现很多不良链接; 或者是修改用户的请求头URL,导致用户的请求被劫持重定向到另外一个网站,用户的请求永远到不了真正的服务器。
2. HTTPS如何保证安全
我们都知道HTTPS是安全的HTTP,那么HTTPS是如何保证通信过程的安全的呢?
如果服务器给客户端的消息是密文的,只有服务器和客户端才能读懂,就可以保证数据的保密性。同时,在交换数据之前,验证一下对方的合法身份,就可以保证通信双方的安全。(和我们平时开发中RSA加签验签,加密解密的过程比较像)。HTTPS就是利用了类似的原理来保证通信的安全性。
所以HTTPS保证安全通信的步骤主要分为两步:
- 通信前验证对方的合法身份;
- 将通信的报文加密,通过密文进行通信。
下面来看看HTTPS的具体实现。
SSL协议——HTTPS的基础
HTTPS实现安全通信的基础是SSL协议。
SSL:(Secure Socket Layer,安全套接字层),为Netscape所研发,用以保障在Internet上数据传输安全,它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
SSL协议位于TCP/IP协议与各种应用层协议之间。SSL协议可分为两层,SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
SSL协议的主要功能
- 加密数据以防止数据中途被窃取;
- 认证用户和服务器,确保数据发送到正确的客户机和服务器;
- 验证数据的完整性,确保数据在传输过程中不被篡改。
下面我们就具体来看看SSL协议是怎么来实现上面三个功能的。
SSL协议加密数据的原理
上面提到SSL协议会把通信的报文进行加密,那么服务器把数据加密后,客户端如何读懂这些数据呢?服务器必须要把加密的密钥(SSL中报文加密使用了对称加密技术,比如DES,3DES,AES等)告诉客户端,客户端才能利用对称密钥解开密文的内容。
但是,如果服务器将这个对称密钥以明文的方式给客户端,这个密钥还是可能会被中间人截获,依然无法保证通信的安全性。
那么服务器要以密文的方式将对称密钥发给客户端的话,客户端又是如何解开这个密文的呢?下面看下SSL协议的工作流程。
- 客户端浏览器向服务器发送SSL/TLS协议的版本号、加密算法的种类、产生的随机数,以及其他需要的各种信息。
- 服务器从客户端支持的加密算法中选择一组加密算法与Hash算法,并且把自己的证书(包含网站地址、加密公钥、证书颁发机构等)也发送给客户端。
- 浏览器获取服务器证书后验证其合法性,验证颁发机构是否合法,验证证书中的网址是否与正在访问的地址一致,通过验证的浏览器会显示一个小锁头,否则,提示证书不受信。
- 客户端浏览器生成一串随机数(这串随机数就是后续用于加密的对称密钥)并用服务器传来的公钥加密,再使用约定好的Hash算法计算握手消息,发送到服务器端。
- 服务器接到握手消息后用自己的私钥解密,并用散列算法验证(这部散列算法验证很重要,可以防止中间人伪造),这样双方都有了此次通信的密钥。
- 服务器再使用密钥加密一段握手消息,返回给客户端浏览器。(这步的作用是告诉客户端,服务器已经正确收到密钥)
- 浏览器用密钥解密,并用散列算法验证,确定算法与密钥。
完成以上7步后双方就可以利用此次协商好的密钥进行通信。
用户和服务器的认证流程
上面的流程描述了浏览器端和服务器端协商加密密钥的过程,在这个过程中我们发现有一步CA认证的过程,其实这个步骤就是在做用户和服务器的认证,可以有效防止“中间人劫持”。
- 中间人劫持
我们现在模拟一下服务器直接将公钥传给客户端,而不是使用CA证书传公钥的场景,看看有什么问题。
中间人在劫持到服务器发送给客户端的公钥(这里是“正确的公钥”)后,并没有发给客户端,而是将自己的公钥(这里中间人也会有一对公钥和私钥,这里称呼为“伪造公钥”)发给客户端。之后,客户端把对称密钥用这个“伪造公钥”加密后,发送过程中经过了中间人,中间人就可以用自己的私钥解密数据并拿到对称密钥,此时中间人再把对称密钥用“正确的公钥”加密发回给服务器。此时,客户端、中间人、服务器都拥有了一样的对称密钥,后续客户端和服务器的所有加密数据,中间人都可以通过对称密钥解密出来。
为了解决此问题,引入了数字证书的概念。服务器首先生成公私钥,将公钥提供给相关机构(CA),CA将公钥放入数字证书并将数字证书颁布给服务器,此时服务器就不是简单的把公钥给客户端,而是给客户端一个数字证书,数字证书中加入了一些数字签名的机制,保证了数字证书一定是服务器给客户端的。中间人发送的伪造证书,不能够获得CA的认证,此时,客户端和服务器就知道通信被劫持了。
- CA证书简介
数字证书就是通过数字签名实现的数字化的证书,证书颁发时会包括证书的内容和证书的签名。我们验证证书是否被篡改的方法是:通过对证书的内容加签名,然后将获得的签名和随证书一同发布的签名做对比,如果两者一致那么证书没有被篡改。
数字证书也有很多的签发机构,不同的签发机构签发的证书,用途也是不一样的,比如iOS开发中,使用到的ipa文件签名证书,需要到苹果申请。而在Web访问中为了防止Web内容在网络中安全传输,需要用到的SSL证书则需要向几家公认的机构签发。这些签发机构统称为CA(Certificate Authority)。
数字证书的一般功能如下:
- 身份授权:确保浏览器访问的网站是经过CA验证的可信任的网站。
- 分发公钥:每个数字证书都包含了注册者生成的公钥(验证确保是合法的,非伪造的公钥)。在SSL握手时会通过certificate消息传输给客户端。
- 验证证书合法性:客户端接收到数字证书后,会对证书合法性进行验证。只有验证通过后的证书,才能够进行后续通信过程。
什么是TLS
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
TLS 1.0是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本,可以理解为SSL 3.1,它是写入了 RFC 的。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。
我们可以简单地将TLS理解为SSL的加强版本。