计算机网络 —— HTTPS 协议

news2025/1/11 5:37:38

前一篇文章:计算机网络 —— HTTP 协议(详解)-CSDN博客

目录

·前言

一、HTTPS 协议简介

二、HTTPS 工作过程

1.对称加密

2.非对称加密

3.中间人攻击

4.引入证书

三、HTTPS 常见问题

1.中间人能否篡改证书?

2.中间人能否调包证书?

3.HTTPS 工作完整流程

·总结


·前言

        前一篇文章中对 HTTP 协议整体做了一个基本介绍,在本篇文章里将介绍一下基于 HTTP 协议创造出来的 HTTPS 协议,关于 HTTPS 协议的重点内容就是它的一个工作过程,它是如何保证我们网络中传输数据的安全性呢?这将是本篇文章的要重点介绍的内容,下面就开始本篇文章的内容介绍。

一、HTTPS 协议简介

        HTTPS 协议与 HTTP 协议一样都是应用层协议,HTTPS 协议是在 HTTP 协议的基础上引入了一个加密层,由于 HTTP 协议的内容都是按照文本的方式明文传输,这就导致在使用 HTTP 协议传输数据的过程中会出现一些数据被篡改的情况,比如:“运营商劫持”。

        什么是 “运营商劫持” 呢?不知道有没有小伙伴在网上搜索某个软件点击下载后发现下的不是要下载的软件而是其他软件,这就是 “运营商劫持”,如下图所示:

图1
图2

        如上图所示,当我们下载一个 “天天动听” 时,图1 未被劫持点击下载按钮是可以弹出正确的天天动听的链接,图2 已被劫持时,点击下载按钮,弹窗的是 QQ浏览器的下载链接,这就是 “运营商劫持”,那么它是如何做到的呢?流程如下图所示:

         当然,不止运营商可以劫持,其他的 “黑客” 也可以用类似的手段来进行劫持,窃取用户的隐私信息,或者篡改内容,所以在互联网上,明文传输是比较危险的事情,HTTPS 就是在 HTTP 的基础上进行了加密,进一步来保证用户的信息安全。

        解决安全问题最核心的要点就是 “加密”,什么是加密呢?加密就是把明文(要传输的真实数据)进行一系列变换,生成密文(针对明文加密之后得到的结果,往往不直观,不易理解),解密就是把密文通过一系列变换,还原成明文,在这个加密与解密的过程中,往往需要一个或者多个中间的数据来辅助完成这个过程,这样的数据就被称为 “密钥”。

二、HTTPS 工作过程

        为了保证数据的安全,HTTPS 就在 HTTP 基础上进行 “加密” 操作,这样网络上传输的数据就不再是直接传输明文了,而是加密之后的 “密文”,加密的方式有很多,但是整体可以分为两大类:“对称加密” 和 “非对称加密”,下面我就来介绍一下 HTTPS 的工作过程,及遇到问题的对应解决方法。

1.对称加密

        对称加密其实就是通过同一个 “密钥”,来把明文加密成密文,并且还可以把密文加密成明文,引入对称加密之后,即使数据被截获,由于黑客不知道密钥是什么,也就无法进行解密进一步去获取我们请求的真实内容了,引入对称加密后,此时数据传输过程如下图所示:

        根据上述介绍可以发现对称加密具有以下特点:

  • 使用对称加密,客户端与服务器需要使用同一个密钥;
  • 不同的客户端需要使用不同的密钥(如果密钥都相同,那么黑客就可以获取密钥)。 

        此时,由于不同客户端使用的密钥都不相同,这就意味着服务器需要维护每个客户端和密钥的关联关系会引入很大的额外开销。

        对称加密除了会引入额外的开销还有一个致命的问题,那就是这种加密并不安全,由于对称密钥是要传输给对方的,就意味着传输密钥的过程是明文传输的,那么此时黑客只要获取到传输的密钥,对称加密的操作就毫无意义了,如下图所示:

         造成上图结果就是因为使用明文传输密钥,黑客就会获取到密钥,后续的加密操作就形同虚设了,所以我们需要对传输的密钥进行加密传输,如果我们对密钥仍进行对称加密的方式进行传输就需要确定一个 “密钥的密钥”,此时面临的问题还是 “密钥的密钥” 是明文,黑客仍然可以拿到密钥,所以对密钥进行加密传输使用对称加密的方式就行不通了,这就需要引入非对称加密。

2.非对称加密

        使用非对称加密主要目的就是为了对 “对称加密” 的密钥进行加密,来确保对称密钥的安全性,在非对称加密中要用到两个密钥:“公钥” 与 “私钥”,公钥和私钥是配对的(公钥对明文加密变成密文,密文只能使用配对的私钥来进行解密),它们最大的缺点就是加密与解密的运算速度非常慢(消耗 CPU 资源),所以不能完全使用非对称加密来对传输的数据进行加密,而只是对“对称加密”的密钥进行加密。

        引入非对称加密之后,就可以由服务器生成公钥和私钥,公钥可以公开给每个客服端,私钥只有自己知道,这样客户端就可以使用公钥对对称密钥进行加密然后传输给服务器,服务器获取到密文使用私钥解密获取到对称密钥,后面就可以继续使用对称加密来进行数据传输了,具体过程如下图所示:

        下面我来对上述过程做一个梳理:

  1.  客户端在本地生成对称密钥,通过公钥加密,发送给服务器;
  2. 由于黑客没有私钥所以无法对截取的数据进行解密进而无法获取对称密钥;
  3. 服务器使用私钥解密,获取对称密钥,使用对称密钥加密给客户端返回的响应;
  4. 后续客户端与服务器的通信使用对称加密即可,由于该密钥只有客户端与服务器两个主机知道,所以黑客截获数据也无法进行解密。

        上述过程虽然看起来安全,但是还有漏洞,由于公钥是需要客户端从服务器这边获取,那么就存在一个问题:获取的公钥是不是黑客伪造的?这就涉及到中间人攻击了。 

3.中间人攻击

        黑客通过中间人攻击就可以获取到对称密钥,由于非对称加密算法是公开的,所以黑客也可以使用非对称加密算法来得到自己的公钥私钥,此时就可以在客户端向服务器发送获取公钥的请求时进行中间人攻击,具体过程如下图所示:

         下面我来对上述过程做一个梳理:

  1. 服务器使用非对称加密算法生成公钥:pub1,私钥:pri1;
  2. 黑客使用非对称加密算法生成公钥:pub2,私钥:pri2;
  3. 客户端生成对称密钥:key;
  4. 客户端向服务器发送请求询问公钥是什么?
  5. 服务器明文传输公钥 pub1 给客户端;
  6. 黑客截取数据,提取公钥 pub1 并保存,然后将数据中的公钥 pub1 替换成自己的公钥 pub2,并将伪造的数据发给客户端;
  7. 客户端收到数据,提取公钥 pub2(并不清楚公钥已经被换),用公钥 pub2 加密对称密钥 key,形成报文发送给服务器;
  8. 黑客截取数据,直接使用自己的私钥 pri2 进行解密,获取到对称密钥 key,再使用保存的服务端公钥 pub1 加密后,将报文发送给服务器;
  9. 服务器拿到报文后,使用私钥 pri1 进行解密,获取对称密钥 key;
  10. 后续服务器与客户端都使用 key 进行对称加密,进行通信,此时黑客就可以使用对称密钥 key 劫持数据对数据进行窃听或者修改。

        那么如何解决中间人攻击这样的问题呢?最关键的一点就在于客户端拿到公钥的时候要有办法验证这个公钥是真的而不是黑客伪造的,这就需要服务器提供一个 “证书”。 

4.引入证书

       证书是一个结构化的数据,其中包含很多的信息,如:证书发布机构、证书有效期、公钥、证书所有者、签名……,服务器在使用 HTTPS 之前需要向第三方公正机构申请一份数字证书,然后服务器把证书传给浏览器,浏览器从证书中获取公钥就可以了,证书就相当于身份证,证明当前公钥的正确性。

        在证书中,用来验证证书真伪的信息就是 “签名”,对于签名要详细介绍一下,这是通过证书解决中间人攻击问题的关键,签名的形成也是基于非对称加密算法的,当服务端申请证书的时候,公正机构就会对服务端进行审核,并专门为该网站形成数字签名,过程如下:

  1. 公正机构拥有非对称加密的公钥:A 和私钥:A*;
  2. 公正机构对服务端申请的证书明文数据进行 hash,形成数据摘要;
  3. 公正机构再对数据摘要用私钥 A* 加密,得到签名 S。

        此时,服务端申请的证书明文与签名 S 就共同形成了证书,这样的证书就颁布给了服务端。这样就可以解决中间人攻击问题,此时数据传输的过程如下图所示:

        图中客户端获取到证书对证书进行校验的过程如下:

  1. 判定证书有效期是否过期;
  2. 判定证书的发布机构是否受信任(操作系统中已经内置了受信任的证书发布机构);
  3. 验证证书是否被篡改:从操作系统中获取证书发布机构的公钥,对签名进行解密,得到 hash 值(数据摘要)设为 hash1,然后计算整个证书的 hash 值设为 hash2,对比 hash1 和 hash2 是否相等,如果相等就说明证书没有被篡改过。 

三、HTTPS 常见问题

1.中间人能否篡改证书?

        中间人无法篡改证书,理由如下:

  • 中间人篡改了证书的明文,由于他没有公正机构的私钥,所以无法在 hash 之后使用私钥形成签名,那么就无法对篡改后的证书形成匹配的签名;
  • 如果中间人强行篡改,客户端收到证书后在验证时就会发现证书明文的 hash 值与签名解密后得到的 hash 值不一样,就会发现证书被篡改,从而终止向服务器传输信息。 

2.中间人能否调包证书?

        中间人无法调包整个证书,理由如下:

  • 中间人没有公正机构的私钥,所以无法制作假的证书;
  • 中间人只能向公正机构申请真证书,然后使用自己申请的证书进行掉包;
  • 但是证书中明文包含了域名等服务端认证信息,所以整体调包客户端依旧可以识别。

        我们要知道,中间人没有公正机构的私钥对任何证书都无法进行合法修改,包括自己的。 

3.HTTPS 工作完整流程

        左侧是客户端要做的事,右侧是服务器要做的事,完整流程如下图所示:

·总结

        文章到此就要结束了,本篇文章重点介绍了 HTTPS 的工作过程,在这里涉及到的密钥一共有三组,如下所示:

  • 第一组(非对称加密):用于校验证书是否被篡改,服务器持有私钥(私钥在注册证书时获得),客户端持有公钥(操作系统包含了可信任的认证机构有哪些,同时持有对应的公钥),服务器使⽤这个私钥对证书的签名进行加密,客户端通过这个公钥解密获取到证书的签名,从⽽校验证书内容是否是篡改过;
  • 第二组(非对称加密):用于协商⽣成对称加密的密钥,服务器生成这组 私钥-公钥 对,然后通过证书把公钥传递给客户端,然后客户端用这个公钥给⽣成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密的密钥;
  • 第三组(对称加密):客户端和服务器后续传输的数据都通过这个对称密钥加密解密。

        ⼀切的关键都是围绕这个对称加密的密钥,其他的机制都是辅助这个密钥⼯作的,第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器,第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥,如果你认为读了本篇文章您有所收获,希望给本篇文章点个赞,收藏走一波,后面我会继续与大家分享计算机网络的相关知识,关注博主不迷路~~~您的支持就是我创作最大的动力,我们下一篇文章再见~~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2257012.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YonBuilder移动开发——调用手机系统的浏览器打开网页

概述 在YonBuilder移动开发中,可以通过使用引擎提供的 api.openWin 或者 api.openFrame 函数方法通过内置的浏览器引擎在App内部打开相关的远程H5网站的网页。但是在实际项目开发中,可能会有一种需求,调用手机操作系统提供的系统浏览器去打开…

美畅物联丨视频接入网关如何配置 HTTPS 证书

在安防领域,视频接入网关(Video Access Gateway,VAG)是视频监控系统的重要组成部分,其职责是把视频数据从前端设备传输至后端服务器。配置HTTPS证书后,可对视频流进行加密传输,避免数据在网络传…

Redis原理—2.单机数据库的实现

大纲 1.Redis数据库的结构 2.读写Redis数据库键值时的处理 3.Redis数据库的构成 4.Redis过期键的删除策略 5.Redis的RDB持久化 6.Redis的AOF持久化 7.Redis的AOF重写机制 8.Redis持久化是影响其性能的高发地 9.Redis基于子进程实现持久化的使用建议 10.Redis持久化的…

Android平台GB28181设备接入模块动态文字图片水印技术探究

技术背景 前几年,我们发布的了Android平台GB28181设备接入模块,实现了不具备国标音视频能力的 Android终端,通过平台注册接入到现有的GB/T28181—2016或GB/T28181—2022服务。 Android终端除支持常规的音视频数据接入外,还可以支…

TaskBuilder SQL执行工具

为了方便开发者连接当前任擎服务器上配置的各个数据源对应的数据库进行相关操作,TaskBuilder提供了一个SQL执行工具,点击系统侧边栏里的执行SQL图标 ,即可打开该工具,界面如下图所示: 该工具从上至下分为三个区域&a…

Redis中pipeline(管道)详解

redis管道pipeline 举个例子: 小卖铺免费让你拿50瓶饮料,你是一次拿一瓶拿回家,还是打包一次或者多次拿回家? 概念 Redis管道(pipelining)是一种在客户端向服务端发送多个请求而不等待响应的技术。它可以显著提高Redis应用程序…

01-Chromedriver下载与配置(mac)

下载地址: 这里我用的最后一个,根据自己chrome浏览器选择相应的版本号即可 ChromeDriver官网下载地址:https://sites.google.com/chromium.org/driver/downloads ChromeDriver官网最新版下载地址:https://googlechromelabs.git…

【Linux操作系统】Linux常用一键脚本

Linux网络加速脚本 Linux网络加速脚本可以替换Linux内核和更改TCP拥塞算法的一键脚本,包括安装BBR内核、XANMOD官方内核,开启BBR加速等功能,总之非常强大。 不卸载内核脚本(一般用这个) wget -O tcpx.sh "http…

Linux -文件系统的备份

本文为Ubuntu Linux操作系统- 第九弹~~ 今天接着上文的内容,讲Linux磁盘存储管理最后一部分内容~ 上期回顾:Linux 图形界面工具管理磁盘分区和文件系统 😎黑犀铠甲合体,流星枪之狂瀑扎帖,碎魔伏暴,灭于狂瀑…

ECharts实战教程:如何生成动态水波纹效果

导语:在数据可视化领域,ECharts是一款非常强大的图表库。今天,我们将带领大家学习如何使用ECharts生成动态水波纹效果,让我们的图表更加生动有趣。 一、准备工作 首先,我们需要准备一些基础数据,如下所示&…

PyQt信号槽实现页面的登录与跳转 #页面进一步优化

将登录框中的取消按钮使用信号和槽的机制,关闭界面。 将登录按钮使用信号和槽连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否为"admin",密码是否为"123456",如果账号密码匹配成功,当前界面关…

STM32CUBEMX+STM32F405RGT6+I2C+AT24C02学习应用

I2C 通讯 机制 较为 繁琐 , 但是I2C的速率比较低,而且EEPROM的容量不大,比如AT24C02的容量 只有 2Kb,即256B(字节)。 对于 想快速实现I 2 C 功能应用,我们借助STM32的HAL库函数 可以 做到 。 一…

Python 基础学习(一)

一.基础语法 注释 Python中单行注释以 # 开头,如下: #!/usr/bin/python3# 第一个注释 print ("Hello, Python!") # 第二个注释多行注释可以用多个 # 号,还有 ‘’’ 和 “”": #!/usr/bin/python3# 第一个注释…

guava 整合springboot 自定义注解实现接口鉴权调用保护

文章目录 一、简要概述二、实现过程1. pom引入依赖2. 自定义注解3. 定义切面4. 定义权限检查逻辑 三、注解使用四、运行结果五、源码放送 一、简要概述 Guava Cache是一个全内存的本地缓存实现,它提供了线程安全的实现机制。我们借助expireAfterWrite过期时间设置和…

Redis实战篇(二:商户查询缓存)

目录 三、商户查询缓存 1.缓存介绍 2.添加商户缓存 (1)缓存模型和思路 (2)代码实现 3.店铺类型缓存 4.缓存更新策略 5.实现商铺缓存与数据库双写一致 6.缓存穿透 (1)介绍 (2&#x…

etcd分布式存储系统快速入门指南

在分布式系统的复杂世界中,确保有效的数据管理至关重要。分布式可靠的键值存储在维护跨分布式环境的数据一致性和可伸缩性方面起着关键作用。 在这个全面的教程中,我们将深入研究etcd,这是一个开源的分布式键值存储。我们将探索其基本概念、特…

Spring Boot + Spring AI快速体验

Spring AI快速体验 1 什么是Spring AI主要功能 2 快速开始2.1 版本说明2.2 配置文件2.3 pom依赖2.3.1 spring maven仓库2.3.2 核心依赖 2.4 定义ChatClient2.5 启动类2.6 测试 3 参考链接 1 什么是Spring AI Spring AI是Spring的一个子项目,是Spring专门面向于AI的…

【网络篇】TCP知识

TCP首部格式? 为什么需要 TCP 协议? TCP 工作在哪一层? IP 层是不可靠的,它不保证网络包的交付、不保证网络包的按序交付也不保证网络包中的数据的完整性。如果需要保障网络数据包的可靠性,那么就需要由上层&#xff0…

【Liunx篇】基础开发工具 - yum

文章目录 🌵一.Liunx下安装软件的方案🐾1.源代码安装🐾2.rpm包安装🐾3.包管理器进行安装 🌵二.软件包管理器-yum🌵三.yum的具体操作🐾1.查看软件包🐾2.安装软件包🐾3.卸载…

Co-Slam论文及复现记录

Overview 输入RGB-D流: { I t } t 1 N { D t } t 1 N \{I_t\}^{N}_{t1}\{D_t\}^{N}_{t1} {It​}t1N​{Dt​}t1N​,它们带有已知相机内参 K ∈ R 3 3 K\in \mathbb{R}^{3\times 3} K∈R33。通过联合优化相机姿态 { ξ t } t 1 N \{\xi_t\}^{N}_{t1} {…