【学习心得】Https篇 第三方劫持密钥之后,Https为什么还能保证安全?

196 阅读4分钟

由于自己没有系统学习过计算机网络,在网络和网安这方面确实比较薄弱。所以前几天把字节一面里面没回答上的与网络相关问题重新复盘了一下。

Https协议为什么更加安全?

这个问题相对简单和基础,在HTTP协议中,数据以明文形式在客户端和服务器之间传输,这意味着中间的任何人(如黑客)都可以拦截并读取这些数据。HTTPS使用SSL/TLS(Secure Sockets Layer/Transport Layer Security)协议对数据进行加密,使得传输的数据只能由发送方和接收方解密,即使数据被拦截,也无法读取其中的内容。

那么。。。

第三方劫持密钥之后,Https为什么还能保证安全?

这里其实题目描述的不是很准确。当时面试官是这么问我的:

  1. “HTTPS如果是用密钥加密的,那密钥发送过程中第三方如果能拦截加密信息,那他应该也可以拦截密钥,那么为什么这种情况下,HTTPS还能保证信息的安全呢?”
  2. 你说到HTTPS是用公钥和私钥,那它是怎么保证秘钥被拦截之后,信息不被泄露呢?

其实现在回头看,这个主要考察的就是对HTTPS连接的建立过程和加密方式这里给大家推荐一篇很简单文章,里面的图解很详细的解释了整个过程:https与中间人攻击

image.png

结合这个图片,我们来说说为什么第三方拦截下密钥之后,HTTPS还能保证信息的安全呢?通过图片,我们可以看出整个过程中只有在第2步中,服务器把公钥发给了客户端。那么公钥顾名思义是公开的,谁都可以获取。那么理论上来说公钥无论给了谁,都不会影响信息的安全,因为它就是公开的。就像我们发在公共社交媒体上的内容,永远不会涉及自己的隐私一样。那这里其实已经可以回答前面的问题,因为第三方能拿到的只有公钥,所以它没办法对信息进行解密。当然这里不包括直接黑进去服务器把私钥拿走了!

那为什么只传递一个公钥就能实现信息的加密了呢?

关键就在于——pre master key。跳过1-6步,我们直接看第7步,客户端自己生成了一个pre master key,然后用公钥加密,并发送给服务器。第8步,服务器用私钥解密,获得pre master key。关键就在这里,客户端把一个自己生成的密码加密传递给了服务器,而第三方并没有解开pre master key的私钥(为什么客户端不需要私钥?因为pre master key就是客户端自己生成的)。最后客户端和服务器各自根据前面传输的random codepre master key就可以计算出真正的master key用于加解密信息。在这整个过程中,第三方是不满足破解pre master key的条件的,因此它无法计算出master key,也就没办法去窃听信息。

那HTTPS就完全安全了吗?

理论上是的,但是如果和客户端通话的并不是真正的服务器,而是第三方的伪造的服务器呢?那么这种情况就叫做中间人攻击了,即第三方伪造成服务器和客户端通话,然后又骗真正的服务器自己是客户端。那么它就可以同时获取两边的信息了。这个过程相对繁琐一点,感兴趣的同学可以自行阅读:https与中间人攻击

这里我只总结一个结论,对中间人攻击来说最关键的就是CA证书的真假。中间人的证书就是花钱买的CA机构认证的证书,或者是用户自己信任了第三方的假证书。那么这个时候你和服务器就都被劫持了。

为什么用户自己同意,就导致客户端和服务器端的信息都泄露了呢?

这里其实是一个惯性思维的问题,服务器端本来就是开放的,大家都可以去访问。但是用户的信息是保密的,有价值的并不是能直接访问到的服务器信息,而是带有用户身份验证之后能获取到的信息。因此如果客户端信息泄露之后,中间人就可以凭借用户的身份去操作服务器端,以获取自己想要的信息或者实现某种特定的操作。

最后

上述内容均为我个人理解,如有不恰当的描述或者比喻,欢迎各位指出

如果大家对其他面试中的某一个问题不理解,或者好奇我的回答的,也欢迎留言。我会有选择性地更新