HTTPS 是怎么保证安全的?可以被中间人攻击吗?

Posted 码农每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTPS 是怎么保证安全的?可以被中间人攻击吗?相关的知识,希望对你有一定的参考价值。

HTTP 的问题

  • 被窃听风险:通信使用明文传输(没有加密),传输内容可能会被窃听(第三方可能捕获通信内容)。
  • 被冒充风险:不会验证通信方的身份,因此有可能遭到被伪装篡改。
  • 被篡改风险:无法证明传输报文的完整性,所以有可能遭篡改的风险。

HTTPS 概况

HTTPS 是怎么保证安全的?可以被中间人攻击吗?

SSL/TLS 安全层的作用就是为了解决上面提到的 HTTP 存在的问题,下面我们来看看它是怎么解决的:

  • 所有的传输信息都是加密传输,第三方无法窃听。
  • 传输配备了身份验证,防止身份被冒充风险。
  • 具有安全校验机制,传输内容一旦被篡改,通信双方会立刻发现被篡改。

加密

对称加密

如果加密和解密使用同一个秘钥则称为共享秘钥加密,也被称为对称秘钥加密。

HTTPS 是怎么保证安全的?可以被中间人攻击吗?

  • 浏览器先发给服务端 client_random 和一系列的加密方法。
  • 接着服务端发送 server_random 和加密方法给 浏览

此时浏览器和服务器有了三个相同的凭证:client_random、server_random 和加密方法。用加密方法把 client_random、server_random 两个随机数混合起来,然后生成秘钥,这个生成的密钥就是浏览器和服务端通信的暗号(对称密钥)。

存在的问题:第三方中间人可以获取到 client_random、server_random 和加密方法,由于这个加密方法同时可以解密,所以中间人可以成功对暗号进行解密,然后拿到数据。

非对称加密

HTTPS 是怎么保证安全的?可以被中间人攻击吗?

  • 首先浏览器会发送给服务端一系列的加密方法。
  • 接着服务端会发送给浏览器加密方法以及公钥。

之后浏览器就通过公钥将数据加密传输给服务端,服务端收到公钥加密的数据使用私钥对其进行解密。服务端给浏览器发送数据时,则先使用自己的私钥对数据进行加密,浏览器收到服务端发送过来的私钥加密数据,使用自己的公钥进行解密即可。

存在的问题:非对称加密效率太低,会严重影响加解密速度,进而影响到用户请求速度。此外,无法保证服务端发送给浏览器的数据安全,服务端的数据只能用私钥进行加密,中间人一旦拿到公钥就可以对服务端传来的数据进行解密,然后就被破解了。

HTTPS 使用对称与非对称加密结合

传输数据阶段依然使用对称加密,但是对称加密的秘钥会采用非对称加密传输。如下图:

HTTPS 是怎么保证安全的?可以被中间人攻击吗?

  • 浏览器向服务端发送 client_random 和加密方法列表。
  • 服务端收到后返回 server_random、加密方法以及公钥。
  • 浏览器收到后生成另一个随机数 pre_master,并用公钥加密,传给服务端( 重点)。
  • 服务端用私钥解密这个被加密后的 pre_master。

到此,服务端和浏览器就有了相同的 client_random、server_random 和 pre_master,然后服务端和浏览器会使用这三组随机数生成对称秘钥。有了对称秘钥后,双方就可以使用这个对称加密的密钥来传输数据。

CA(数字证书)

使用对称和非对称混合方式实现了数据加密传输,但这种方式仍存在一个致命问题,服务端可能是被冒充的。这样,浏览器访问的就是被冒充的服务端,冒充者可以在自己的服务器上实现公钥和私钥,而对浏览器来说,它并不完全知道现在访问的是一个被冒充的服务器。所以,服务器需要证明自己的身份,需要使用权威机构颁发的证书,这个权威机构就是 CA(Certificate Authority),颁发的证书就称为数字证书 (Digital Certificate)。

对于浏览器来说,数字证书有两个作用:

  • 通过数字证书 CA 向浏览器证明服务器的身份。
  • 数字证书里面包含了服务器公钥。

下面是含有数字证书的 HTTPS 请求流程,如下:

HTTPS 是怎么保证安全的?可以被中间人攻击吗?

相对于不含数字证书的 HTTPS 请求流程,主要有如下两个改动:

  • 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥正是包含数字证书中的。
  • 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后序流程。

HTTPS 中间人攻击

HTTPS 从协议上解决了 HTTP 时代的中间人攻击问题,但是 HTTPS 在用户主动信任了伪造证书的时候也会发生中间人攻击(比如早期的 12306 需要手动信任证书),HTTPS 中间人攻击流程如下:

  1. 客户端用 HTTPS 连接服务器的 443 端口。
  2. 服务器下发自己的数字证书给客户端。
  3. 黑客劫持了服务器的真实证书,并伪造了一个假的证书给浏览器。
  4. 浏览器可以发现得到的网站证书是假的,但是浏览器选择信任。
  5. 浏览器生成随机对称密钥 A,用伪造的证书中的公钥加密发往服务器。
  6. 黑客同样可以劫持这个请求,得到浏览器的对称密钥 A,从而能够窃听或者篡改通信数据。
  7. 黑客利用服务器的真实公钥将客户端的对称密钥 A 加密发往服务器。
  8. 服务器利用私钥解密这个对称密钥 A 之后与黑客通信。
  9. 黑客利用对称密钥 A 解密服务器的数据,篡改之后利用对称密钥 A 加密发给客户端。
  10. 客户端收到的数据已经是不安全的了。

以上就是 HTTPS 中间人攻击的原理,这也就是 HTTPS 抓包为什么要信任证书的原因。所以,操作系统内置权威 CA 公钥来保证数字签名以及数字证书的安全性。实施 HTTPS 中间人攻击需要手动信任攻击者的假证书。

到此常用的就回答完毕了,你能完整回答吗?

HTTPS 是怎么保证安全的?可以被中间人攻击吗?


往期精彩回顾


点击左下角阅读原文查看历史经典技术问题汇总,看完顺手一键三连呀~

以上是关于HTTPS 是怎么保证安全的?可以被中间人攻击吗?的主要内容,如果未能解决你的问题,请参考以下文章

在HTTPS安全页面中加载HTTP不安全的内容,如何绕过安全警告?

SSH:远程登陆

https 不会被中间人攻击——因为中间人即使拿到了数据,也是加密的

iOS开发如何避免安全隐患

08.如何保证API接口的安全性问题01

https 连接的前几毫秒发生了什么