Http 和 Https 的区别
- Http 基于 TCP,默认端口号为 80,Https 基于 TLS,TLS 基于 TCP,默认端口是 443
- Http 的安全性很差,Https 的安全性很强
- Http 只需要一次 TCP 连接,而 Https 需要两次,第一次检查证书的有效性,第二次才是真正的连接
Https 怎么加密数据?
- 对称加密:一把密钥,用密钥加密,用密钥解密
- 非对称加密:两把密钥,公钥加密,私钥解密
非对称加密+对称加密:
既然非对称加密耗时,那非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。当然是可以的,且非对称加密、解密各只需用一次即可。
请看一下这个过程:
- 某网站拥有用于非对称加密的公钥A、私钥A。
- 浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
- 浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
- 服务器拿到后用私钥A解密得到密钥X。
- 这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都通过密钥X加密解密即可。
但是,这种策列却无法防备中间人攻击。
因此,需要确保浏览器收到的公钥一定是该网站的公钥,解决方法即为 数字证书。
每次进行HTTPS请求时都必须在SSL/TLS层进行握手传输密钥吗? 这也是我当时的困惑之一,显然每次请求都经历一次密钥传输过程非常耗时,那怎么达到只传输一次呢?
服务器会为每个浏览器(或客户端软件)维护一个session ID,在TLS握手阶段传给浏览器,浏览器生成好密钥传给服务器后,服务器会把该密钥存到相应的session ID下,之后浏览器每次请求都会携带session ID,服务器会根据session ID找到相应的密钥并进行解密加密操作,这样就不必要每次重新制作、传输密钥了!