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

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 我们在浏览器中通信用的比较多的是 HTTP 和 HTTPS 两种协议,但是用 HTTPS 时浏览器总是会有一个小锁的标志,提醒我们这是安全链接,而 HTTP 它就会提醒我们这是不安全的链接,好家伙,只

我们在浏览器中通信用的比较多的是 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 要快,中间人不知道对称密钥无法解密信息

参考资料

数字签名 及 数字证书 原理

相关文章
|
1月前
|
存储 缓存 安全
https访问提示不安全,证书密钥验证上如何解决
【10月更文挑战第4天】访问提示不安全,证书密钥验证上如何解决
254 2
|
2月前
|
安全 网络协议 网络安全
在实现HTTPS时,有哪些常见的安全协议
在实现HTTPS时,有哪些常见的安全协议
118 1
|
1月前
|
编解码 JSON 安全
使用search-guard加固安全为https访问
使用search-guard加固安全为https访问
|
6月前
|
缓存 安全 Java
7张图带你轻松理解Java 线程安全,java缓存机制面试
7张图带你轻松理解Java 线程安全,java缓存机制面试
|
3月前
|
Java
【Java集合类面试十二】、HashMap为什么线程不安全?
HashMap在并发环境下执行put操作可能导致循环链表的形成,进而引起死循环,因而它是线程不安全的。
|
3月前
|
安全 算法 Java
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
这篇文章讨论了Java集合类的线程安全性,列举了线程不安全的集合类(如HashSet、ArrayList、HashMap)和线程安全的集合类(如Vector、Hashtable),同时介绍了Java 5之后提供的java.util.concurrent包中的高效并发集合类,如ConcurrentHashMap和CopyOnWriteArrayList。
【Java集合类面试二】、 Java中的容器,线程安全和线程不安全的分别有哪些?
|
3月前
|
安全 Nacos 数据安全/隐私保护
【技术干货】破解Nacos安全隐患:连接用户名与密码明文传输!掌握HTTPS、JWT与OAuth2.0加密秘籍,打造坚不可摧的微服务注册与配置中心!从原理到实践,全方位解析如何构建安全防护体系,让您从此告别数据泄露风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其连接用户名和密码的明文传输成为安全隐患。本文探讨加密策略提升安全性。首先介绍明文传输风险,随后对比三种加密方案:HTTPS简化数据保护;JWT令牌减少凭证传输,适配分布式环境;OAuth2.0增强安全,支持多授权模式。每种方案各有千秋,开发者需根据具体需求选择最佳实践,确保服务安全稳定运行。
317 0
|
5月前
|
安全 网络协议 算法
Android网络基础面试题之HTTPS的工作流程和原理
HTTPS简述 HTTPS基于TCP 443端口,通过CA证书确保服务器身份,使用DH算法协商对称密钥进行加密通信。流程包括TCP握手、证书验证(公钥解密,哈希对比)和数据加密传输(随机数加密,预主密钥,对称加密)。特点是安全但慢,易受特定攻击,且依赖可信的CA。每次请求可能复用Session ID以减少握手。
63 2
|
4月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
68 0
|
4月前
|
安全 Java 调度
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
Java面试题:Java内存优化、多线程安全与并发框架实战,如何在Java应用中实现内存优化?在多线程环境下,如何保证数据的线程安全?使用Java并发工具包中的哪些工具可以帮助解决并发问题?
62 0