为什么HTTPS是安全的?

news/2024/10/22 18:46:37/

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

1. HTTP 协议

1.1 HTTP 协议介绍

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

96111849f2564b479872ae665b2fe6f6.png

 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.36wd=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 协议使用起来确实非常的方便,但是它存在一个致命的缺点:不安全。

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

  1. 小明在 JAVA 贴吧发帖,内容为我爱JAVA:

441ae2c9c0a84a42b1feec59360b0100.png

2. 被中间人进行攻击,内容修改为我爱PHP

6566dd26c86442998831251e2f57d185.png

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

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

1.3 防止中间人攻击

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

1. 双方约定加密方式

963b0688790e464cb912b9ade72f91d1.png

 2. 使用 AES 加密报文

1b1dcce487a14feea4c17fbab2f6a95b.png

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

402485471cc046baae48f8487455ec37.png

 那么对于这种情况,我们肯定就会考虑能不能将秘钥进行加密不让中间人看到呢?答案是有的,采用非对称加密,我们可以通过 RSA 算法来实现。

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

98e0a7fd8c5f40c596685e930b60df88.png

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

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

53e5d2eb463e43698480b7aa3c5c5091.png

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

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

 

2. HTTPS 协议

2.1 HTTPS 简介

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

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

91ec793b81d1413d969a07e264664d22.png

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

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

2.2 CA 认证体系

上一节我们看到客户端需要对服务器返回的 SSL 证书进行校验,那么客户端是如何校验服务器 SSL 证书的安全性呢。

  • 权威认证机构

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

78de5299e71b42718aa2b0408243b482.png

  • 签发证书

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

22411122a84d4c88937b5a5697df7090.png

db373181db1841018ca5c060d28265b5.png

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

  • 如何验证服务器证书

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

084dcc55f7ce4fb191fe4c2f52561d6a.png

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

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

 

总结

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

 

欢迎点赞收藏转发🙏🙏

                               -End-





 

 

 

 

 

 


http://www.ppmy.cn/news/189255.html

相关文章

Spring Cloud

SpringCloud 服务注册中心 1.Eureka基础知识 什么是服务治理? Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,管理比较复杂,所以需要使用服务治理,管理服务与服务之间的依赖关系,…

付费课程:路径规划、机器学习、运筹优化算法以及数据分析领域

目录 授课形式 学习内容可包含 附加内容 教学价格 授课形式 线上课程&#xff0c;一对一教学 学习内容可包含 python从入门到精通 matlab入门及保姆级程序调试方法 cplex入门到精通 运筹学方面 最优化理论-单纯形法、分支定界法、列生成法、切平面法 机器学习方面 机器学习…

python matplotlib的常见参数以及画图示例

legend()中loc matplotlib中的legend主要用来设置图例相关的内容&#xff0c;其中loc用来表示图例的具体位置&#xff0c;他的可选的参数可以是字符&#xff0c;也可以是数字&#xff0c;默认情况下是0&#xff08;即best&#xff09;&#xff0c;参数及意思如下&#xff1a; …

单细胞UMAP降维图的修饰(一些偏僻问题)

本来呢&#xff0c;单细胞UMAP或者TSNE降维图正常展示就好了&#xff0c;最多修改颜色坐标就可以&#xff0c;但是奈何总是有文章挑战别人的眼睛&#xff0c;非要秀一波非常规操作&#xff0c;那我们也只能把他们打下神坛。 事情的起因是看了这篇文章中的UMAP图&#xff0c;有啥…

AMD R9 370X 4G 显卡黑苹果mojave 10.14.5 安装

近期用R9 370x 4G安装mojave 10.14黑苹果&#xff0c;用clover启动安装成功后显卡默认为ati hd 7xxx,颇感不爽&#xff0c;多次失败后&#xff0c;终于成功&#xff08;系统显示r9 370x 4G)。 一切操作都在clover configurator中完成&#xff0c;英文不好的同学请自行百度下载…

R语言绘制Vonoroi图

deldir包绘制Voronoi图 #install.packages("deldir") library(deldir)# data set.seed(1) x <- runif(60) y <- runif(60)# Calculate Voronoi Tesselation and tiles tesselation <- deldir(x, y) tiles <- tile.list(tesselation)plot(tiles, pch 19…

R语言绘制三元相图

vcd包绘制三元相图 【示例文件】 #install.packages("vcd") library(vcd)data read.table("new_otu_table.txt",headT,sep"\t",comment.char "") data1head(data,n20) cdata1[c("A5","A7","B1")] …

R语言绘制高密度散点图2

#EasyCharts团队出品&#xff0c; #如有问题修正与深入学习&#xff0c;可联系微信&#xff1a;EasyChartslibrary(ggplot2) library(RColorBrewer) #-----------------------------(b) 带透明度设置的散点图------------------------------ mydata<-read.csv("HighDe…