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

2023-09-20 09:39:55


1. HTTP 协议

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

1.1 HTTP 协议介绍

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

在这里插入图片描述

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

  • 请求
POST http://www.baidu.com 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://blog.didispace.com/spring-boot-learning-2x/

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

1.小明在 JAVA 贴吧发帖,内容为我爱JAVA:
在这里插入图片描述
2.被中间人进行攻击,内容修改为我爱PHP
在这里插入图片描述
3.小明被群嘲(手动狗头)
可以看到在 HTTP 传输过程中,中间人能看到并且修改 HTTP 通讯中所有的请和响应内容,所以使用 HTTP 是非常的不安全的。

1.3 防止中间人攻击

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

  1. 双方约定加密方式
    在这里插入图片描述
  2. 使用 AES 加密报文
    在这里插入图片描述

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

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

在约定加密方式的时候由服务器生成一对公私钥,服务器将公钥返回给客户端,客户端本地生成一串秘钥(AES_KEY)用于对称加密,并通过服务器发送的公钥进行加密得到(AES_KEY_SECRET),之后返回给服务端,服务端通过私钥将客户端发送的AES_KEY_SECRET进行解密得到AEK_KEY,最后客户端和服务器通过AEK_KEY进行报文的加密通讯,改造如下:
在这里插入图片描述
可以看到这种情况下中间人是窃取不到用于AES加密的秘钥,所以对于后续的通讯是肯定无法进行解密了,那么这样做就是绝对安全了吗?

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

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

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

2. HTTPS 协议

2.1 HTTPS 简介

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

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

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

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

2.2 CA 认证体系

  • 权威认证机构

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

在这里插入图片描述

  • 签发证书

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

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

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

  • 如何验证服务器证书

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

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

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

总结

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

更多推荐

CRM软件系统趣味性——游戏化销售管理

对于企业销售来说,高薪酬也伴随着更高的压力与挑战。高强度的单一工作会让销售人员逐渐失去对工作的兴趣,导致售状态缺少动力和激情,工作开展愈加困难。您可以通过CRM系统进行游戏化销售管理,让销售人员重新干劲满满。游戏并不是纯粹的娱乐,它其实还是提升个人竞争意识、团队协作的一种方式,因此,将它一味的妖魔化是不可取的。也正因如

Linux 中nc指令的使用总结

nc指令概述用法一:端口扫描用法二:命令行中发送和接收数据用法三:建立双方通信nc指令概述nc是Linux系统中的netcat命令之简称,它是一个强大的网络工具,可以用于创建TCP/UDP套接字连接。常见的其用法模板可定位:nc[选项][地址][端口],它的用法如下图所示:知道你英语差了一丢丢,小鸽鸽给你准备了中文版:

【C++】string类模拟实现下篇(附完整源码)

目录1.resize2.流插入<<和流提取>>重载2.1流插入<<重载2.2流提取<<3.常见关系运算符重载4.赋值重载4.1浅拷贝的默认赋值重载4.2深拷贝赋值重载实现4.3赋值重载现代写法5.写时拷贝(了解)6.源码6.1string.h6.2test.cpp1.resize下面我们来实现一下resize():re

【C++ 程序设计】实战:C++ 实践练习题(21~30)

目录21.计算并输出1到9之间奇数之和22.多层嵌套计算23.循环结构:打印变量a、b、c24.函数调用:全局变量、局部变量25.找到数组中不等于最大值和最小值的元素26.计算:平方根、平方、立方根、立方27.找出三个整型数中的最大值28.初始化一个5x5的二维数组a,根据表达式(i+1)*(j+1)将数组元素设置为i

【UML】软件工程中常用图:类图、部署图、时序图、状态图

作者简介:前言:UML中的很多东西平时都听过、用过,诸如类图、时序图等,本文将详细详细讲一下UML中常用的几类图,并且会引入一个完整的例子来讲解,UML在工程上到底该怎么合理使用。目录1.概述1.1.什么是UML?1.2.UML用在何处?2.静态结构2.1.类图2.2.部署图3.描述动态3.1.顺序图3.2.状态图4.

【UML】详解UML类图

目录1.概述2.权限3.关系3.1.连线关系3.2.依赖3.3.泛化(继承)3.4.实现3.5.关联3.6.聚合3.7.组合1.概述UML是什么?书面化一点的说法是:UML(UnifiedModelingLanguage),统一建模语言,是一种用于软件工程和系统设计的标准图形化建模语言。它旨在帮助开发人员、设计师和分析

8年经验之谈 —— App测试常用的两种工具

一、监控工具DDMS的全称是DalvikDebugMonitorService,是Android开发环境中的Dalvik虚拟机调试监控服务。提供测试设备截屏、查看特定进程正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、模拟接收及发送SMS、虚拟地理坐标等服务。启动DDMSEclipse中启动方法:1

Java 泛型

一、泛型简介Java泛型(generics)是JDK5中引入的一个新特性,泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。下面给一个Java泛型的简单例子:publicstatic<E>voidprintArray(E[]in

【产品运营】如何提升B端产品竞争力(下)

“好产品不是能力内核,做好产品的流程才是”一、建立需求池和需求反馈渠道需求池管理是B端产品进化最重要的环节,它的重要性远超产品设计、开发等其他环节。维护需求池有主动和被动两种。主动维护是产品经理在参与售前、迭代、交付、售后、竞品分析、老板沟通等活动时自己发掘、记录需求,主动收集需求的渠道很多,但不同渠道收集到的需求质量

两届 TOKEN 2049 之间,孙宇晨和波场的布局与野心

2022年在新加坡举办的TOKEN2049大会上,波场TRON创始人、火币全球顾问委员会成员孙宇晨作为特邀嘉宾出席,并曾提出“波场TRON下一步的发展目标是成为主流金融机构”的生态愿景,揭示了波场生态的全新发展方向,以及孙宇晨作为区块链和加密技术的长期布道者,对加密行业未来发展趋势的展望。时隔一年,2023TOKEN2

Java版分布式微服务云开发架构 Spring Cloud+Spring Boot+Mybatis 电子招标采购系统功能清单

项目说明随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化平台提高招投标工作的公开性和透明性;通过电子化招投标,使得招标采购的质量更高、速度

热文推荐