您的位置 首页 java

面试官:HTTPS 是如何保证传输安全的?又被问了

1. HTTP 协议

在谈论 HTTPS 协议之前,先来回顾一下 HTTP 协议的概念。

1.1 HTTP 协议介绍

HTTP 协议是一种基于文本的传输协议,它位于 OSI 网络模型中的 应用层

面试官:HTTPS 是如何保证传输安全的?又被问了

HTTP 协议是通过客户端和服务器的请求应答来进行通讯,目前协议由之前的 RFC 2616 拆分成立六个单独的协议说明( RFC 7230、RFC 7231、RFC 7232、RFC 7233、RFC 7234、RFC 7235),通讯报文如下:

  • 请求
 POST  HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Content-Length: 7
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

wd=HTTP
  
  • 响应
 HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset =utf-8
Date: Thu, 14 Feb 2019 07:23:49 GMT
Transfer-Encoding: chunked

<html>...</html>
  

1.2 HTTP 中间人攻击

HTTP 协议使用起来确实非常的方便,但是它存在一个致命的缺点: 不安全 。如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:

我们知道 HTTP 协议中的报文都是以明文的方式进行传输,不做任何加密,这样会导致什么问题呢?下面来举个例子:

  1. 小明在 JAVA 贴吧发帖,内容为 我爱JAVA
面试官:HTTPS 是如何保证传输安全的?又被问了

  1. 被中间人进行攻击,内容修改为 我爱PHP
面试官:HTTPS 是如何保证传输安全的?又被问了

  1. 小明被群嘲(手动狗头)

可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中所有的请和响应内容,所以使用 HTTP 是非常的不安全的。

1.3 防止 中间人攻击

这个时候可能就有人想到了,既然内容是明文那我使用 对称加密 的方式将报文加密这样中间人不就看不到明文了吗,于是如下改造:

  1. 双方约定加密方式
面试官:HTTPS 是如何保证传输安全的?又被问了

  1. 使用 AES 加密报文
面试官:HTTPS 是如何保证传输安全的?又被问了

这样看似中间人获取不到明文信息了,但其实在通讯过程中还是会以明文的方式暴露加密方式和秘钥,如果第一次通信被拦截到了,那么秘钥就会泄露给中间人,中间人仍然可以解密后续的通信:

面试官:HTTPS 是如何保证传输安全的?又被问了

那么对于这种情况,我们肯定就会考虑能不能将秘钥进行加密不让中间人看到呢?答案是有的,采用 非对称加密 ,我们可以通过 RSA 算法 来实现。最近整理了一份最新的面试资料,里面收录了2021年各个大厂的面试题,打算跳槽的小伙伴不要错过,点击领取吧!

在约定加密方式的时候由服务器生成一对 公私钥 ,服务器将 公钥 返回给客户端,客户端本地生成一串秘钥( AES_KEY )用于 对称加密 ,并通过服务器发送的 公钥 进行加密得到( AES_KEY_SECRET ),之后返回给服务端,服务端通过 私钥 将客户端发送的 AES_KEY_SECRET 进行解密得到 AEK_KEY ,最后客户端和服务器通过 AEK_KEY 进行报文的加密通讯,改造如下:

面试官:HTTPS 是如何保证传输安全的?又被问了

可以看到这种情况下中间人是窃取不到用于 AES加密 的秘钥,所以对于后续的通讯是肯定无法进行解密了,那么这样做就是绝对安全了吗?

所谓道高一尺魔高一丈,中间人为了对应这种加密方法又想出了一个新的破解方案,既然拿不到 AES_KEY ,那我就把自己模拟成一个客户端和服务器端的结合体,在 用户->中间人 的过程中中间人模拟服务器的行为,这样可以拿到用户请求的明文,在 中间人->服务器 的过程中中间人模拟客户端行为,这样可以拿到服务器响应的明文,以此来进行中间人攻击:

面试官:HTTPS 是如何保证传输安全的?又被问了

这一次通信再次被中间人截获,中间人自己也伪造了一对公 私钥 ,并将公钥发送给用户以此来窃取客户端生成的 AES_KEY ,在拿到 AES_KEY 之后就能轻松的进行解密了。

中间人这样为所欲为,就没有办法制裁下吗,当然有啊,接下来我们看看 HTTPS 是怎么解决通讯安全问题的。

2. HTTPS 协议

2.1 HTTPS 简介

HTTPS 其实是 SSL +HTTP 的简称,当然现在 SSL 基本已经被 TLS 取代了,不过接下来我们还是统一以 SSL 作为简称, SSL 协议其实不止是应用在 HTTP 协议上,还在应用在各种应用层协议上,例如: FTP WebSocket

其实 SSL 协议大致就和上一节 非对称加密 的性质一样,握手的过程中主要也是为了交换秘钥,然后再通讯过程中使用 对称加密 进行通讯,大概流程如下:

面试官:HTTPS 是如何保证传输安全的?又被问了

这里我只是画了个示意图,其实真正的 SSL 握手会比这个复杂的多,但是性质还是差不多,而且我们这里需要关注的重点在于 HTTPS 是如何防止中间人攻击的。

通过上图可以观察到,服务器是通过 SSL 证书 来传递 公钥 ,客户端会对 SSL 证书进行验证,其中证书认证体系就是确保 SSL 安全的关键,接下来我们就来讲解下 CA 认证体系 ,看看它是如何防止中间人攻击的。

2.2 CA 认证体系

上一节我们看到客户端需要对服务器返回的 SSL 证书进行校验,那么客户端是如何校验服务器 SSL 证书的安全性呢。如果您正在学习Spring Boot,那么推荐一个连载多年还在继续更新的免费教程:

  • 权威认证机构

在 CA 认证体系中,所有的证书都是由权威机构来颁发,而权威机构的 CA 证书都是已经在操作系统中内置的,我们把这些证书称之为 CA根证书

面试官:HTTPS 是如何保证传输安全的?又被问了

  • 签发证书

我们的应用服务器如果想要使用 SSL 的话,需要通过权威认证机构来签发 CA证书 ,我们将服务器生成的公钥和站点相关信息发送给 CA签发机构 ,再由 CA签发机构 通过服务器发送的相关信息用 CA签发机构 进行加签,由此得到我们应用服务器的证书,证书会对应的生成证书内容的 签名 ,并将该 签名 使用 CA签发机构 的私钥进行加密得到 证书指纹 ,并且与上级证书生成关系链。

这里我们把 百度 的证书下载下来看看:

面试官:HTTPS 是如何保证传输安全的?又被问了

面试官:HTTPS 是如何保证传输安全的?又被问了

可以看到百度是受信于 GlobalSign G2 ,同样的 GlobalSign G2 是受信于 GlobalSign R1 ,当客户端(浏览器)做证书校验时,会一级一级的向上做检查,直到最后的 根证书 ,如果没有问题说明 服务器证书 是可以被信任的。

  • 如何验证服务器证书

那么客户端(浏览器)又是如何对 服务器证书 做校验的呢,首先会通过层级关系找到上级证书,通过上级证书里的 公钥 来对服务器的 证书指纹 进行解密得到 签名(sign1) ,再通过签名算法算出服务器证书的 签名(sign2) ,通过对比 sign1 sign2 ,如果相等就说明证书是没有被 篡改 也不是 伪造 的。

面试官:HTTPS 是如何保证传输安全的?又被问了

这里有趣的是,证书校验用的 RSA 是通过私钥加密证书签名,公钥解密来巧妙的验证证书有效性。

这样通过证书的认证体系,我们就可以避免了中间人窃取 AES_KEY 从而发起拦截和修改 HTTP 通讯的报文。

总结

首先先通过对 HTTP 中间人攻击的来了解到 HTTP 为什么是不安全的,然后再从安全攻防的技术演变一直到 HTTPS 的原理概括,希望能让大家对 HTTPS 有个更深刻的了解。

面试官:为什么数据库连接很消耗资源,资源都消耗在哪里?

2022-04-11 19:19·小程序建站

本文主要想探究一下连接数据库的细节,尤其是在 Web 应用中要使用数据库来连接池,以免每次发送一次请求就重新建立一次连接。对于这个问题,答案都是一致的,建立数据库连接很耗时,但是这个耗时是都多少呢,又是分别在哪些方面产生的耗时呢?

本文以连接 MySQL 数据库为例,因为 MySQL 数据库是开源的,其 通信协议 是公开的,所以我们能够详细分析建立连接的整个过程。

首先先看一下连接数据库的 Java 代码,如下:

 Class.forName("com.mysql. jdbc .Driver");

String name = "xttblog2";
 String  password = "123456";
String url = "jdbc:mysql://172.16.100.131:3306/xttblog2";
Connection conn = DriverManager.getConnection(url, name, password);
// 之后程序终止,连接被强制关闭
  

然后通过 Wireshark 分析整个连接的建立过程,如下:

Wireshark抓包

在上图中显示的连接过程中,可以看出 My SQL 的通信协议是基于 TCP 传输协议的,而且该协议是二进制协议,不是类似于 HTTP 的文本协议,其中建立连接的过程具体如下:

  • 第1步:建立 TCP 连接,通过三次握手实现;
  • 第2步:服务器发送给客户端 「握手信息」 ,客户端响应该握手消息;
  • 第3步:客户端 「发送认证包」 ,用于用户验证,验证成功后,服务器返回OK响应,之后开始执行命令;

用户验证成功之后,会进行一些连接变量的设置,比如 字符集 、是否自动提交事务等,其间会有多次数据的交互。完成了这些步骤后,才会执行真正的数据查询和更新等操作。

在本文的测试中,只用了5行代码来建立连接,但是并没有通过该连接去执行任何操作,所以在程序执行完毕之后,连接不是通过 Connection.close() 关闭的,而是由于程序执行完毕,导致进程终止,造成与数据库的连接异常关闭,所以最后会出现 TCP RST 报文。在这个最简单的代码中,没有设置任何额外的连接属性,所以在设置属性上占用的时间可以认为是最少的(其实,虽然我们没有设置任何属性,但是驱动仍然设置了字符集、事务自动提交等,这取决于具体的驱动实现),所以整个连接所使用的时间可以认为是最少的。但从统计信息中可以看出,在不包括最后 TCP RST 报文时(因为该报文不需要服务器返回任何响应),但是其中仍需在客户端和服务器之间进行往返 「7」 次, 「也就是说完成一次连接,可以认为,数据在客户端和服务器之间需要至少往返7次」 ,从时间上来看,从开始TCP的三次握手,到最终连接强制断开为止(不包括最后的 RST 报文),总共花费了:

 10.416042 - 10.190799 = 0.225243s = **225.243ms**!!!
  

这意味着,建立一次数据库连接需要225ms,而这还是还可以认为是最少的,当然 「花费的时间可能受到网络状况、 数据库服务器 性能以及应用代码是否高效的影响」 ,但是这里只是一个最简单的例子,已经足够说明问题了!

由于上面是程序异常终止了,但是在正常的应用程序中,连接的关闭一般都是通过 Connection.close() 完成的,代码如下:

 Class.forName("com.mysql.jdbc.Driver");

String name = "shine_user";
String password = "123";
String url = "jdbc:mysql://172.16.100.131:3306/clever_mg_test";
Connection conn = DriverManager.getConnection(url, name, password);
conn.close();
  

这样的话,情况发生了变化,主要体现在与数据库连接的断开,如下图:

网络抓包

  • 第1步:此时处于 MySQL 通信协议阶段,客户端发送关闭连接请求,而且不用等待服务端的响应;
  • 第2步:TCP断开连接,4次挥手完成连接断开;

这里是完整地完成了从数据库连接的建立到关闭,整个过程花费了:

 747.284311 - 747.100954 = 0.183357s = 183.357ms
  

这里可能也有网络状况的影响,比上述的225ms少了,但是也几乎达到了200ms的级别。

那么问题来了,想象一下这个场景,对于一个日活2万的网站来说,假设每个用户只会发送5个请求,那么一天就是10万个请求,对于建立数据库连接,我们保守一点计算为150ms好了,那么一天当中花费在建立数据库连接的时间有(还不包括执行查询和更新操作):

 100000 * 150ms = 15000000ms = 15000s = 250min = 4.17h
  

也就说每天花费在建立数据库连接上的时间已经达到 「4个小时」 ,所以说 数据库连接池 是必须的嘛,而且当日活增加时,单单使用数据库连接池也不能完全保证你的服务能够正常运行,还需要考虑其他的解决方案:

  • 缓存
  • SQL 的预编译
  • 负载均衡
  • ……

当然这不是本文的主要内容, 「本文想要阐述的核心思想只有一个,数据库连接真的很耗时,所以不要频繁的建立连接」

本人花费2个月时间,整理了一套JAVA开发技术资料,内容涵盖java基础,分布式、微服务等主流技术资料,包含大厂面经,学习笔记、源码讲义、项目实战、讲解视频。

面试官:HTTPS 是如何保证传输安全的?又被问了

面试官:HTTPS 是如何保证传输安全的?又被问了

面试官:HTTPS 是如何保证传输安全的?又被问了

希望可以帮助一些想通过自学提升能力的朋友,领取资料,扫码关注一下

记得转发+关注+私信

私信回复【2022学习资料】

领取更多学习资料

文章来源:智云一二三科技

文章标题:面试官:HTTPS 是如何保证传输安全的?又被问了

文章地址:https://www.zhihuclub.com/193536.shtml

关于作者: 智云科技

热门文章

网站地图