# HTTP/HTML/浏览器

# 0. 说一下 HTTP 和 HTTPS

  1. 概念

HTTP:超文本传输协议

HTTPS (opens new window): HTTP 协议的安全版本,在传输层实现 SSL 加密。

HTTPS 主要作用是 建立一个信息安全通道,来确保数据的传输,确保网站的真实性。

  1. 区别

HTTP 数据使用明文传输。 HTTPS 使用 SSL + HTTP 协议构建可进行加密传输和身份认证的网络协议。

HTTP 的端口是 80,HTTPS 的端口是443

  1. HTTPS 工作原理

因为 HTTP 协议的数据传输过程是明文的,传输的内容随时会被中间人窃取、伪造、篡改,所以传输过程毫无安全可言。
所以需要引入加密方案。

从 HTTP 协议栈层面来看,我们可以在 TCP 和 HTTP 之间插入一个安全层,所有经过的数据都会被加密或者解密。

总的来说,安全层有两个主要的职责:对发起的 HTTP 请求的数据进行加密操作;对接收到 HTTP 的内容进行解密操作。

  • 第一版 使用对称加密

即,加密和解密都使用相同的密钥。

对称加密的请求流程:

  • 浏览器发送加密套件 和 客户端随机数;
  • 服务器选择某种加密套件,返回加密套件和服务端随机数;
  • 浏览器和服务器返回确认消息。

客户端和服务端都具有相同的 客户端随机数、服务端随机数和同一种加密套件;
使用相同的方法将客户端随机数和服务端随机数混合起来生成一个密钥;
最后使用这个密钥和之前选择的加密套件进行加密的数据传输。

缺点:传输客户端随机数和服务端随机数的过程是明文的,所以可以被黑客截取,拿到协商的加密套件和双方的随机数,另外合成密钥的算法是公开的,所以黑客也能够通过随机数和算法合成密钥,这样的数据依旧可以被破解。

  • 第二版 使用非对称加密

非对称加密有两把密钥,使用其中一个密钥加密,那么就要用另一个密钥解密。

服务器会将其中一个密钥以明文的形式发送到浏览器,这个密钥称为公钥。服务器自身持有的密钥称为私钥。

非对称加密的请求流程:

  • 浏览器发送加密套件列表给服务器;
  • 服务器选择加密套件,并将公钥发送给浏览器;
  • 浏览器和服务器返回确认消息。

非对称加密能保证浏览器发送给服务器的数据是安全的。

缺点:

  • 非对称加密的效率太低。

  • 无法保证服务器发送给浏览器的数据安全:因为黑客可以获取到明文传输的公钥,服务器使用私钥加密的内容可以通过公钥和加密方法进行解密,从而泄露信息。

  • 第三版 对称加密和非对称加密搭配使用

在数据传输阶段使用对称加密,加密的密钥使用非对称加密来传输。

改造后的流程:

  • 浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数 client-random
  • 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和 公钥
  • 浏览器保存公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据
  • 服务器拿出私钥,解密出 pre-master 数据,并返回确认消息。

此时,服务器和浏览器同时拥有了 client-random、service-random、pre-master,然后服务器和浏览器会使用这三组随机数生成对称密钥,浏览器和服务器使用相同的方法生成最终的密钥 master

pre-master 是经过公钥加密后传输的,所以黑客无法获取到 pre-master,也就无法生成 密钥。保证了黑客无法破解传输过程中的数据了。

  • 第四版 添加数字证书

通过对称加密和非对称加密实现了数据的加密传输,但是依旧存在问题。

黑客通过 DNS 劫持将 IP 地址替换为了 黑客的 IP 地址,这样访问的服务器就变成了黑客的服务器,所有的过程都在黑客的服务器上交互,也就泄露了公钥和私钥。

而且,浏览器完全不知道访问的是什么网站。

所以,我们还需要服务器向浏览器提供证明 "我就是我"

请求流程相对于第三版,主要有两点改变:

  • 服务器没有返回公钥,而是返回了数字证书,公钥包含在数字证书中
  • 浏览器端多了一步验证证书的操作,验证证书之后,确定站点安全,才会继续生成 pre-master,并传递给服务端生成最后密钥

通过引入数字证书,实现了服务器的身份认证功能。即便黑客伪造了服务器,但数字证书是无法伪造的,所以无法欺骗用户。