HTTPS的连接过程与加密机制

上一篇博客提到了HTTPS,今天就来回顾下HTTPS连接过程中的各个阶段和使用的加密机制吧。维基百科对其定义如下:

Hypertext Transfer Protocol Secure (HTTPS) is an extension of the Hypertext Transfer Protocol (HTTP). It is used for secure communication over a computer network, and is widely used on the Internet.[1][2] In HTTPS, the communication protocol is encrypted using Transport Layer Security (TLS) or, formerly, Secure Sockets Layer (SSL). The protocol is therefore also referred to as HTTP over TLS,[3] or HTTP over SSL.

简单的说,HTTPS仍然用HTTP进行通讯,但在此基础上使用SSL/TLS协议加密封包。引入该协议主要是因为HTTP协议明文传输数据,存在以下三大问题:

  1. 由于数据是明文传输的,容易造成用户隐私泄漏。
  2. 网站可靠性存疑,可能是恶意攻击者伪装。
  3. 数据的完整性无法证明,可能被篡改。

解决方案

针对问题一,直观的解决方案是对数据进行加密。对称加密算法是一种常见的加密方式,加密/解密使用相同的密钥。使用了该加密算法后,黑客即使截获了数据,若没有密钥就无法解密。但是此时存在的问题是,浏览器/服务器如何发送密钥呢?密钥在传输过程中可能被黑客截获,那么数据就不再安全了。

此时可引进非对称加密算法解决上述问题。服务器可将「公钥」发送给用户,用户使用该「公钥」加密数据。由于只有服务器拥有对应的「私钥」可以解密数据。黑客即使截获了数据也无法破解。

这种方式下,用户发送给服务器的数据就都是经过加密的。但是,如果服务器要给用户发送数据呢?因为「公钥」是在网上传播的,用户可以拿「公钥」解密服务器发送的数据,黑客同样也可以。看来这时候一对公/私钥就不够了,用户也需要将自己的「公钥」发送给服务器。服务器发送数据前使用该「公钥」加密数据。这样就只有对应的用户能解密数据了。

这样看起来就比较"完美"了--但其实仍然存在问题:黑客可以截获服务器发送的「真公钥」,然后替换为「假公钥」再发送给用户。用户此时并没有感知,还以为是服务器发送的「真公钥」。用户使用黑客生成的「假公钥」加密数据,黑客就可以使用「假私钥」解密。知道了数据内容后,黑客甚至可以对数据进行修改,然后再使用服务器的「真公钥」加密后发给服务器。由此,黑客完成了用户数据的窃取和篡改。

上述攻击称为"中间人攻击",对于用户和服务器而言,都没有感知到存在第三方。究其原因,主要是用户无法判别获取到的「公钥」的合法性。此时就需要使用「数字证书」来为网站和「公钥」做背书,「数字证书」是由权威机构签发。「数字证书」上会包含「公钥」、证书的授予机构、证书所有者、有效时间等信息。权威机构(Certificate Authority)先对上述证书中包含的信息做一次Hash计算,再使用自己的私钥对Hash计算的结果进行加密(加密结果称为数字签名)。用户拿到证书后,使用权威机构的「公钥」对数字签名进行解密,再对数字证书里的信息也做一次Hash计算。如果解密结果和Hash计算结果相同,则证明证书为真。网站和「公钥」都是可信的。

这里需要注意的一点是:用户持有权威机构的「公钥」。那么用户是怎么获得权威机构的「公钥」呢?其实这是预装在操作系统中的。所以千万不要安装来历不明的系统,否则就相当于在裸奔。

至此,黑客就彻底无法破解、篡改用户的数据了。网站方也能够证明自身的合法性。(即解决了HTTP的第二、三个问题)

展示评论