您现在的位置是:首页 > 正文

HTTPS如何防止中间人攻击

2024-04-01 00:37:04阅读 2

首先服务器需要向数字认证机构(以下简称CA)申请证书,比如现在服务器想发布一个网站www.abc.com(以下简称abc),服务器生成公开密钥算法的一对密钥,比如RSA密钥。服务器会先生成一个证书签名请求文件CSR,其中包括网站域名、RSA的公钥、营业执照等,然后将这个请求文件发送给CA申请证书。CA拿到CSR文件以后,首先会校验域名abc的拥有者与证书申请者的身份。校验完成以后,CA机构使用哈希函数生成一个哈希值H1,然后用自己的密钥(比如ECDSA密钥)的私钥对这个哈希值进行签名得到数字签名,然后将数字签名放在CSR文件后面,这就是最终的证书文件(也就是说 CA证书=服务器信息+数字签名)。

浏览器向服务器端请求abc网站时,服务器收到请求后,会将证书文件与RSA密钥的公钥一块发给浏览器(注意证书文件里面是包括RSA密钥的公钥的)。浏览器收到证书文件,由于浏览器内置了CA机构的根证书,根证书中包含了ECDSA密钥的公钥,所以浏览器就能用公钥对数字签名进行解密,得到哈希值H1,然后再用同样的哈希方法对服务器信息进行哈希得到哈希值H2,通过比对H1和H2就能发现证书是否被篡改。

HTTPS的连接过程,除了TCP的三次握手以外,还增加了四次通信:

第一次:⾸先,由浏览器向服务器发起加密通信请求,在这⼀步,客户端主要向服务器发送以下信息:1.客户端⽀持的 SSL/TLS 协议版本,如 TLS 1.2 版本。2.客户端⽣产的随机数( Client Random ),后⾯⽤于⽣产「会话秘钥」。3.客户端⽀持的密码套件列表,如 RSA 加密算法。

第二次:服务器收到客户端请求后,向客户端发出响应。服务器回应的内容有如下内容:1.确认 SSL/ TLS 协议版本,如果浏览器不⽀持,则关闭加密通信。2.服务器⽣产的随机数( Server Random ),后⾯⽤于⽣产「会话秘钥」。3.确认的密码套件列表,如 RSA 加密算法。4. 服务器的数字证书。

第三次:客户端收到服务器的证书之后,⾸先经过上述验证过程,确认服务器的数字证书的真实性以及验证证书是不是abc这个网站发来的。如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使⽤它加密报⽂,向服务器发送如下信息:1.⼀个随机数( pre-master key ),该随机数会被服务器公钥加密。2.加密通信算法改变通知,表示随后的信息都将⽤「会话秘钥」加密通信。3.客户端握⼿结束通知,表示客户端的握⼿阶段已经结束。这⼀项同时把之前所有内容的发⽣的数据做个摘要,⽤来供服务端校验。

注意: 由于上面的验证机制,证书在传输过程中是无法被中间人进行修改的,如果中间人对证书进行修改,那么浏览器在对数字签名进行解密后就会出现两个哈希值匹配错误的情况。由于随机数用服务器的公钥进行了加密,中间人没有服务器的私钥,也无法对其进行解密。

到这里,服务器和客户端就同时有三个随机数(两个明文传输,一个用服务器公钥加密传输),接着就⽤双⽅协商的加密算法,各⾃⽣成本次通信的「会话秘钥」,由于中间人无法得到最后一个随机数,所以无法生成对应的「会话秘钥」。

第四次:服务器收到客户端加密后的第三个随机数( pre-master key )之后,用私钥解密拿到随机数,服务器通过协商的加密算法,计算出本次通信的「会话秘钥」。然后,向客户端发⽣最后的信息:1.加密通信算法改变通知,表示随后的信息都将⽤「会话秘钥」加密通信。2.服务器握⼿结束通知,表示服务器的握⼿阶段已经结束。同时把之前所有内容发⽣的数据做个摘要,⽤来供客户端校验。

⾄此,整个 SSL/TLS 的握⼿阶段全部结束。接下来,客户端与服务器进⼊加密通信,就完全是使⽤普通的 HTTP协议,只不过⽤「会话秘钥」加密内容。

网站文章

  • Linux系统下运行很慢如何解决

    Linux系统下运行很慢如何解决

    解决Linux系统下cpu占用率过高导致程序运行缓慢的问题

    2024-04-01 00:36:58
  • 微型前端简介

    微型前端简介

    重点(Top highlight)The first time I heard the term micro frontend, my eyes rolled into the back of my ...

    2024-04-01 00:36:30
  • eclipse转idea找不到项目某些配置文件

    eclipse转idea找不到项目某些配置文件

    <!--这个元素描述了项目相关的所有资源路径列表,例如和项目相关的属性文件,这些资源被包含在最终的打包文件里。--><resources>   <resource>      <!--   描述存放资源的目录,该路径相对POM路径-->      <directory>src</directory>      &lt...

    2024-04-01 00:36:23
  • chatgpt赋能python:Python计算器代码实现——简单又实用

    def calculator(expression) : # 主体逻辑代码 return result其中,参数expression:\.\d+)?') # 匹配数字 operator = r...

    2024-04-01 00:36:17
  • android 移除子view,android-从父视图中移除视图与隐藏视图

    在android中,如果我从其父视图中移除视图,而在父视图中隐藏子视图(GONE不可见).我知道隐藏的视图仍将保留在内存中,但说到父视图的物理外观会有所不同吗?如果答案没有不同,那是否意味着当我隐藏子...

    2024-04-01 00:36:08
  • MySQL数据库总结

    MySQL数据库总结

    文章目录DDL操作数据库、表操作数据库查看数据库查询创建数据库mysql的字符集创建数据库修改数据库删除数据库使用数据库操作表查询表(use、show)数据类型创建表(create)复制表(like)...

    2024-04-01 00:35:44
  • linux关闭无响应文件夹,4种强制关闭Ubuntu中无响应应用程序的方法

    linux关闭无响应文件夹,4种强制关闭Ubuntu中无响应应用程序的方法

    4种强制关闭Ubuntu中无响应应用程序的方法在使用Ubuntu时,我们的一个或多个进程和应用程序可能会经常挂起。重新启动我们的系统并不总是最佳解决方案,我们发现自己在寻找能够快速、轻松和安全地摆脱无...

    2024-04-01 00:35:36
  • 一文讲清Mybatis架构

    一文讲清Mybatis架构

    MyBatis功能架构设计 功能架构讲解: 我们把Mybatis的功能架构分为三层: API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数...

    2024-04-01 00:35:28
  • 程序设计实习MOOC/第十五周编程作业/B:A Knight's Journey(TUD Programming Contest 2005, Darmstadt, Germany)

    程序设计实习MOOC/第十五周编程作业/B:A Knight's Journey(TUD Programming Contest 2005, Darmstadt, Germany)

    题目:B:A Knight's Journey总时间限制: 1000ms 内存限制: 65536kB描述BackgroundThe knight is getting bored of seeing the same black and white squares again and again and has decided to make a journeyaround the wo

    2024-04-01 00:35:02
  • java前端显示统计报表数据_强大的报表前端展现功能

    灵活的查询交互报表为用户提供了通用的查询面板用于各种条件过滤,在报表展现界面,用户设定各查询条件的值后点击查询按钮,报表数据便将根据输入的条件值动态查询出相应的结果。形象的图表结合报表以形象美观的图表...

    2024-04-01 00:34:54