「图文并茂」写一篇通俗易懂的 H TTP(下)|8月更文挑战

1,055 阅读6分钟

这是我参与8月更文挑战的第5天,活动详情查看: 8月更文挑战

借 8 月更文挑战督促自己,感谢掘金!

前面写过了一篇 HTTP 的基础知识的文章,有 Header、响应码以及 Cookie 等介绍。现在,我们得思考一下,数据在网络中传输安全性能否得到保障。先说结论,HTTP是不安全的传输协议,通常我们会使用HTTPS。 接下来看这篇文章的大致结构:

截屏2021-08-07 10.22.26.png

HTTP和HTTPS的区别

一、HTTP 存在的问题

其实,在网络上数据的传输并不是由发送方直接就到达了接收方,数据在传输的过程中,是由一个一个的节点进行传输的进行转发,最后才到达了接收方的。那么,数据在传输的 是否会存在不安全的情况。例如,数据被第三个窃听、甚至是有篡改的风险。这就是HTTP之所以会被取代的重要原因,因为HTTP对传输的数据没有加密,数据是以明文进行传输的,很容易被监听、窃取和篡改。而HTTPS 的出现正是为了解决HTTP在传输过程中的不安全而产生的,那么HTTPS是什么呢?

二、HTTPS又是什么

HTTPS是什么呢?首先需要说明的是 HTTPS 并不是一种的新的协议,它是在HTTP的基础上套了一层 TLS 和 SSL,从而变成了HTTPS。HTTPS 能够保证数据传输的安全性,除了对数据进行加密之外,还需要验证 CA 机构签发的证书。

三、STL 和 SSL

前面讲到了HTTPS使用 SSL 和 TLS 来保证数据传输的安全性,那么是什么 TLS SSL 呢?TLS(Transport Layer Security,传输层安全协议) 和 SSL 的(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的协议层。通过 SSL 认证,使用数字签名确保数据的完整性、使用加密来确保数据的私密性,以实现客户端和服务端的安全通信。

在 TCP/IP 网络分层理论中,网络可以分成四层: 截屏2021-08-07 15.08.51.png

那么 TLS 和 SSL 又处于一个什么样的位置呢?来看下面的的这张图:

截屏2021-08-07 15.10.41.png

为什么有 TLS 和 SSL 就能够实现数据传输安全呢,HTTPS 又是如何保证的呢?

HTTPS是如何保证数据安全的

一、数据加密

前面我们知道了 HTTP 数据传输是以明文进行传输的,HTTPS 对数据进行了加密,那么 HTTPS 是怎么对数据进行加密的呢?

既然需要对数据进行加密,就必须的采用一定的加密算法。实际上,加密算法可以分为对称加密和非对称加密,那么什么是对称加密什么是非对称加密呢?截取了维基百科的定义:

公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

可以看到,对称加密算法加密和解密都使用一个密钥,因此对称加密使用的效率高,非对称加密的效率比较低。很明显,网络中数据的传输是追求效率的,这里数据传输应该使用对称加密,就像下面这样:

截屏2021-08-07 16.16.23.png

可以看到,对数据进行加密之后,监听者拿到的是密文,由于它没有密钥,所以无法对密文进行解密,数据看起来是安全的。但是这里存在一个问题,客户端和服务器使用的密钥A是如何得到的呢?无论怎样,客户端和服务器在首次通信都是明文的,需要把这个密钥A进行传输对方。

为了解决这个问题,我们引入了非对称加密。那么,非对称加密是如何保证数据传输安全的呢?

非对称加密分为公钥和私钥,公钥用来加密数据,私钥用来解密数据,公钥允许在网络中传输,私钥不允许泄露。客户端想要向服务器请求数据,首先它会生成一个密钥,并且使用服务器的公钥对这个随机值进行加密,服务器收到这条消息之后,会使用自己的私钥对其进行解密,从而获得密钥,接下来就可以使用对称加密进行数据传输了,画了一个示意图:

截屏2021-08-07 16.46.47.png

二、证书校验

上面讲了数据的加密,实际上还忽略一个重要的点,客户端使用服务器的公钥进行加密,如果有第三者把这个公钥替换成自己的公钥,并且成功用自己的私钥进行了解密,那么传输的数据岂不是泄露了,又画了一个示意图:

截屏2021-08-07 17.10.49.png

为了解决这个问题,引入证书这样的一种机制。下面是掘金平台证书:

截屏2021-08-07 17.16.13.png

这个证书是有 CA 机构进行签发认证的,那这个证书都包含了哪些信息呢?很明显,这个证书至少应该包含公钥,还有网站域名、有效时长以及签发机构。另外,我们如何验证 这个 CA 机构是合法的呢?这就需要使用根证书了,在我们的操作系统内部。在掘金平台的证书中,我们可以看到对它进行签发的机构是Encryption Everywhere DV TLS CA - G1,我们系统的根证书DigiCert Global Root CA又对这个签发机构的证书进行验证,在哪里找到这个系统的更证书呢?在 MacOS 中,可以在钥匙串中找到:

截屏2021-08-07 17.31.29.png

如果有人会问,系统的这个证书怎么进行校验呢?这样下去岂不是无限递归了呢?很遗憾告诉大家,到这一步证书校验就停止了,你必须无条件信任这个系统的根证书,所以不会发生无限递归的情况。

是不是神奇?奇奇怪怪的知识又增加了。以上就是 HTTPS 原理了,虽然不够深入,但是在面试被问到的时候,也不至于说一句:Https 是安全的 Http

总结

下面来做一个总结:

截屏2021-08-07 17.55.42.png

一切的总结都在图中,就不必多说了。另外,总算圆了标题的「图文并茂」。

另外,由于水平有限,有错误的地方在所难免,未免误导他人,欢迎大佬指正!码字不易,感谢大家的点赞关注!🙏