面试题之 HTTPS 为什么是安全的?

2,110 阅读7分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

我们在浏览器中通信用的比较多的是 HTTPHTTPS 两种协议,但是用 HTTPS 时浏览器总是会有一个小锁的标志,提醒我们这是安全链接,而 HTTP 它就会提醒我们这是不安全的链接,好家伙,只是差了一个字母你浏览器就要区别对待?

10.png

11.png

因为 http 不太安全

其实主要是因为 HTTP 是一个明文传输协议,用它传输内容等同于果奔,你能想象到你给别人发的私密信息被陌生人看到后的社死现场吗?

12.webp

当然作为一个前端,我在浏览器中看到 httpshttp 的数据都是‘明文’,毕竟请求已经到我这里了,那么怎么证明我的信息在用 http 传输的时候实际上是明文呢?你可以用 wireShark 去抓个包啊,抓包之后就可以看到了

13.jpg

那么 HTTPS 为什么是安全的?

先说答案,它是由三种算法加持,外加知名机构背书

14.webp

对称加密

只是说完上面一行字肯定是不够的,还是得再多拓展一下

既然我们知道 http 是明文传输的,如果别人用 wireShark 之类的抓包工具抓一下包,你的信息可能就泄露了,所以通信的双方的发送的内容是可以被看到的

为了解决这个问题我们可以使用对称加密的方式去加密内容,也就是 AES 算法,而对称加密就是通信双方都用同样的密钥加密解密传输内容,其过程如下

15.png

注意一个小细节,我们的加密解密都是通过这个密钥去完成的,所以单独一方加密完了还不行,发送方和接收方都需要有这个密钥,那个密钥不能是一开始就有的,一些的密钥不可能在我买电脑的时候就存好了,比如我需要掘金的密钥,我难道需要到掘金的服务器去问一下密钥吗?

所以肯定是在通信的过程中顺便发送的(比如三次握手以后第一次传输),而密钥发送同样因为抓包之类的操作,存在被中间人拦截的可能,所以密钥的发送也是不安全的,万一这个中间人把我的密钥也拿了,我以后的通信内容不就被他看到了?

16.png

所以面对互联网的信息传输使用对称加密不太现实,等同于大声密谋,它适用场景比较适合于通信双方已经提前约定俗成,关于对称加密的更多信息请自行查阅,凯撒密码就是属于对称加密

非对称加密

对称加密不行还可以上非对称加密,对应 RSA 算法,非对称加密的核心机制是公钥私钥机制,简单来说就是,公钥谁都可以看,而私钥只有我自己有,可以用下面的图形象生动的解释

17.png

拥有公钥的人可以往我的邮箱里面塞信件,而只有我拥有私钥能够打开我的信箱,拿出里面的邮件阅读

其具体过程如下

18.png

这下我发送信息给服务器就不慌了,就算我的舍友拦截我的请求也不知道里面是什么,就算他坏的一批,修改了我的包的内容,服务器大不了看作是垃圾数据吗

但是这个非对称加密还是有三个问题

  1. 它很慢,如果我要对我的 GET 请求加密,GET 请求的 url 长度在 Chrome 中被限制为 8182 个字符,如果都加密,可能会很久
  2. ‘我’怎么拿到‘你’的公钥?
  3. ‘我’怎么知道是‘你’的公钥?

非对称加对称

对于上面的第一个问题,非对称加密慢那我用对称加密,但对称加密需要密钥,传输存在风险,那我就用非对称加密传输对称加密的密钥,如下图

20.png

还有另一个问题,‘我’怎么拿到‘你’的公钥?,互联网的两台计算机可能距离千里,拿到公钥还是靠传送,所以是 https TLS 握手阶段传的公钥

21.png

在上面的图的过程中,预主密钥是在本地生成的,中间人无法知道,而在传输过程中用公钥加密,中间人没有私钥无法知道,保证了数据私密,但是前面说过密钥的传输是可以被发现的,也是和对称加密有同样的问题,中间人是可以修改我们的公钥的,甚至是伪造成服务器,和下图所示

22.png

中间人拦截了请求,用自己的生成的公钥密钥去骗,去偷袭浏览器的信息

23.webp

数字证书

这一步就是所谓的知名机构背书,让这个知名机构把我的‘公钥’证明是我的公钥,接收方拿到公钥后去知名机构那里比对一下就行了,这个知名机构通常被叫做 CA, Certificate Authority,它的公钥传送具体流程如下

19.png

CA 机构的私钥给你的服务器提供的信息(公钥以及服务器相关信息)加密得到数字签名,然后对这个服务器发起 HTTP 请求时,服务器就把这个数字签名加上公钥以及服务器相关信息加上,这个通常被叫做数字证书

简单的说一下,为什么这样传递公钥不会被中间人恶意利用

  1. 首先,CA 公钥是已经预先存储好在你的电脑里面的,因此不存在中间人攻击,除非你的电脑是被恶意设计过的
  2. 数字证书用 hash 算法去给数字证书中的内容去加密,得到摘要,Hash 是单向加密,中间人拿到之后无法解密,只能修改,但是当数字证书到达浏览器后会进行一个数字签名比对的过程,如果发现用 CA 公钥解出来的内容和 CA 私钥加密过的内容不一致,说明被篡改了,此次连接不可信,注意,小细节,我们 hash 后得到的是摘要,说明它足够小,因为我们提供的公钥以及一些相关信息可能很多,而 RSA 非对称加密本来就很耗时,如果我们直接比对原文去判断数字证书是否被篡改,是很浪费的,因此要 Hash 一下
  3. 然后中间人截取 HTTPS,它用它自己生成的公钥私钥替代 CA 机构的公钥私钥,是无法被浏览器信任的,用户浏览器会使用本地存储的 CA 公钥解密,解不开说明是不可信的,注意:中间人拿到服务器的公钥没有任何意义

注意,通信双方建立可信链接,只需要服务端的公钥便可以

最后补上一张 HTTPS TLS 握手图帮助大家理解

24.png

总结

  1. HTTPS 建立请求前,先发数字证书
    1. 身份验证,拿到正确的公钥,是请求的正确的服务器
    2. 完整性验证,确保公钥没有被篡改
  2. 非对称加密(RSA),拿到服务器公钥后,浏览器用这个公钥加密出对称密钥发送给服务器,服务器用私钥解密,中间人没有私钥获取不到信息
  3. 通信双方使用对称密钥加密信息传送,速度比 RSA 要快,中间人不知道对称密钥无法解密信息

参考资料

数字签名 及 数字证书 原理