这段时间在家真是太闷了,新的笔记本也是最近才到,终于可以干活了,不过新的电脑还要下载软件环境、配置等等。趁着这等待的时间,我去学习了下https协议的知识,这里整理出来,和大家分享一下。
了解https到底是如何确保数据传输的安全,有助于我们更好的理解并解决开发中遇到的实际问题,同时也是面试时面试官经常会问到的一块知识。
在正式开始介绍前,我们需要先知道两个概念:对称加密和非对称加密;
对称加密就是只用一个密钥进行加密和解密。非对称加密则有两个密钥,分为公钥和私钥,一方用公钥进行加密,另一方用私钥进行解密。公钥一般存在浏览器,私钥存储在服务器。
对称加密因为双方都是用同一个密钥,所以解密效率会比较高,但安全性相对较低,而非对称加密则安全性会比前者要高很多,但效率也比对称加密要差很多。
有了上面两个概念,我们就可以开始了,首先抛出一个问题:https为确保数据传输的安全,使用的是非对称加密还是对称加密?
接着往下看,你就知道答案了。
首先,我们先来看看传统的http网络传输有什么问题?先来看一张图:
因为http是明文传输的,意味着我们的数据很容易被其他人监听并窃取的。另外,数据也容易被其他有心人篡改,导致浏览器与服务器收发的内容不一致,示意图如下所示:
明文传输是指:协议本身不提供对数据进行加密的功能。即使自己对数据进行加密,在传输时也是被当做明文来看。
也就是说使用http协议进行数据传输,至少存在数据被监听或数据被恶意篡改两种风险,因此,http协议是一种不安全的传输协议。
那解决方案当然就是使用https协议了,我们先尝试自己想想该怎么保障http数据的安全,进而一步步去理解为什么https协议能够保障数据的安全。
首先,http传输的数据不是容易被别人监听、篡改吗?那么我们只需要对数据进行加密不就好了?上面提到有两种加密的方式,应该用哪种方式呢?在网络上传输数据是非常讲究效率的,那当然是使用对称加密了。看看我们的示意图:
好了,这样就算有其他人监听或者篡改数据,数据不正确,浏览器在解密的时候也会知道。但现在又有一个问题了:浏览器如何与服务器商定好一个共同的密钥?并且不让窃听者知道?就算是浏览器随机生成一个,但也需要在首次请求时将密钥发送给服务器吧!如果是这样,那首次请求的时候仍然是一个明文传输,密钥还是有被他人窃取的风险。
那这怎么办?既然我们怕对称密钥被他人窃取,那我们再给这个密钥进行非对称加密不就好了!?浏览器用公钥进行加密,服务器再用私钥进行解密,服务器就可以得到对称密钥了,示意图如下:
而且我们只需要在浏览器第一次与服务器商定密钥时进行一次非对称加密,一旦服务器接收到浏览器随机生成的密钥,双方就可以使用对称加密来通信了,效率不会受到影响。
这确实是个非常好的解决方案,但到现在,数据安全就真的得到保障了吗?还没有,我们还忽略了一个问题:浏览器又是如何知道服务器的公钥 ?虽然公钥属于一个公开的数据,不怕被人监听,但这玩意被人篡改了怎么办?如果浏览器用假的公钥对数据进行加密,那窃听者就可以假的私钥进行解密,数据依然不安全。示意图如下:
也就是说只要我们是从网上得到的服务器公钥,都会有被他人篡改的风险。
这时候就要引入一个机构:证书授权中心,也就CA机构;
CA机构专门给各个服务器网站授权数字证书,以确保浏览器获得的网站公钥是合法正确的。那CA机构又是如何完成这繁琐的工作的呢?我们一步步看。
首先,网站先把自己的公钥、网站域名等信息提交给CA机构,CA机构再利用网站的公钥、域名等信息,制作证书。最后会用CA机构自己的私钥对证书进行加密,形成一个数字证书,并将加密后的证书文件发送给网站服务器,网站再把证书配置到服务器上。
当有浏览器访问我们网站时,网站会先把证书文件发送给浏览器,浏览器在用CA机构的公钥对证书进行解密就可以得到网站的公钥了。
这时我们学聪明了,立马又认识到一个问题:CA机构的公钥从而来?
这个很简单,虽然世界上的网站有千千万,但合法的CA机构又有几家呢?一般来说,厂家都会把世界上的CA机构的公钥内置在操作系统中,当浏览器需要解密CA证书时,再遍历操作系统的公钥,只要其中一个公钥能够正确解密,这个证书就是合法的。浏览器解密CA证书成功后,便会显示如下界面:

好啦,网站的公钥我们也能安全的得到了,但你说,万一窃听者也去申请了合法的CA证书,然后用这个证书替换了网站发往浏览器的证书,那浏览器得到的不就是窃听者网站的公钥了吗?
小伙子真是越来越聪明了,不过这个问题事实上已经被CA机构解决了。还记得CA证书里面包含的信息吗?网站的域名也是证书的一部分。当浏览器解密CA证书后发现网站的域名不正确,此时浏览器仍然会显示异常的界面,示意图如下所示:
异常界面像这样:
问题解决到现在,网络传输终于足够安全了,这其实也是https协议的工作原理。
我们开头说的问题:https为确保数据传输的安全,使用的是非对称加密还是对称加密?答案也显而易见了,是用非对称加密和对称加密相结合的方式。
兄dei,如果觉得我写的还不错,麻烦帮个忙呗 😃
- 给俺点个赞被,激励激励我,同时也能让这篇文章让更多人看见,(#.#)
- 不用点收藏,诶别点啊,你怎么点了?这多不好意思!
拜托拜托,谢谢各位同学!