【计网】从零开始认识https协议 --- 保证安全的网络通信
从零开始认识https协议
- 1 什么是https协议
- 2 https通信方案
- 2.1 只使用对称加密
- 2.2 只使用非对称加密
- 2.3 双方都使用非对称加密
- 2.4 非对称加密 + 对称加密
- 3 中间人攻击
- 4 签名与CA证书
- 4.1 签名
- 4.2 CA证书
- 5 https通信最终方案
1 什么是https协议
之前的文章中我们详细的讲解了http协议,从代码底层的实现一步一步的理解了http协议。其中我们根据http协议中请求和应答的结构重点实现了http协议中的httpRequest
和httpResponse
。进行通信时,浏览器(客户端)会向服务端发送请求,请求中的所有信息(请求行 ,URL ,cookie ,正文…)都是明文。明文是没有进行过加密的信息,那么就会造成一些安全问题。
- 客户端与服务端进行通信不是直接进行通信的,而是通过第三方的运营商进行信息的中转。
- 作为中间人的运营商就能够看到客户端和服务端通信的信息是是什么,这样势必会造成用户隐私的泄漏!
- 大庆警方破获的DNS劫持案:这是全国首起涉及通信运营商DNS劫持的案件。案件中,犯罪团伙通过与通信运营商内部人员勾结,在运营商机房内架设了镜像数据服务器,并安装了“劫持程序”。这导致上网用户流量被非法控制,并强制跳转到指定的网页。该案涉及21人,是一个大规模的网络犯罪团伙。
- 流量劫持案例:2014年年底,沈文等人通过域名和流量劫持非法牟利。他们通过技术操作捕获不特定上网用户的实时上网流量,并完成用户域名跳转的劫持操作。这种行为不仅给网民带来不便,也对互联网企业的正常运营造成影响。最终,沈文等人被判处有期徒刑11年,并处罚金10万元。
为了避免这样的问题,最要紧的就是将信息进行加密,把明文转换为密文,这样运营商就不会轻易的获取到客户端与服务端之间的信息了!而由此诞生的就是https协议!https协议中会进行一些加密算法:
- 对称加密:采用单钥密码系统的加密方法, 同一个密钥可以同时用作信息的加密和解密, 这种加密方法称为对称加密, 也称为单密钥加密。
- 特征: 加密和解密所用的密钥是相同的
- 常见对称加密算法(了解): DES、 3DES、 AES、 TDEA、 Blowfish、 RC2 等
- 特点: 算法公开、 计算量⼩、 加密速度快、 加密效率⾼
- 非对称加密:需要两个密钥来进行加密和解密, 这两个密钥是公开密钥(public key, 简称公钥) 和私有密钥(private key, 简称私钥) 。
- 特征:非对称加密要用到两个密钥, 一个叫做 “公钥”, 一个叫做 “私钥”。公钥和私钥是配对的。 最大的缺点就是运算速度非常慢, 比对称加密要慢很多。
- 常见非对称加密算法(了解): RSA, DSA, ECDSA
- 特点: 算法强度复杂、 安全性依赖于算法与密钥但是由于其算法复杂, 而使得加密解密速度没有对称加密解密的速度快。
当然仅仅通过加密算法,还是不能保证安全,需要使用相应的策略!
2 https通信方案
2.1 只使用对称加密
如果通信双方都各自持有同一个密钥 X, 且没有别人知道, 双方就可以通过密钥加密与解密,而作为中间人由于不知道密钥,无法获取真正的信息,所以这两方的通信安全当然是可以被保证的(除非密钥被破解)。
但是,矛盾的一点是:如何让双方都持有同一个密钥?
- 如果每次通信,第一次进行时都由客户端(浏览器)将密钥交给服务端,注意这里的密钥在通信中也是进行了加密。服务端收到信息之后,根本就还没获得密钥,又如何将密钥从信息中解密出来呢?
- 如果不将密钥进行加密传输,直接把密钥明文传输, 那么中间人也就能获得密钥了,此时后续的加密操作就形同虚设了!
所以只使用对称加密是不可行的!
2.2 只使用非对称加密
鉴于非对称加密的机制:**需要客户端和服务端分别持有公钥和私钥。**那么想要进行通信的话就也需要将密钥进行通信!
- 如果服务器先把公钥以明文方式传输给浏览器, 之后浏览器向服务器传数据前都先用这个公钥加密好再传, 从客户端到服务器信道似乎是安全的(其实也是有安全问题的,后面讲解中间人攻击), 因为只有服务端有相应的私钥能解开公钥加密的数据。但是服务器到浏览器的这条路怎么保障安全?
- 如果服务器用它的私钥加密数据传给浏览器, 那么浏览器用公钥可以解密它, 而这个公钥是一开始通过明文传输给浏览器的, 若这个公钥被中间人劫持到了, 那他也能用该公钥解密服务器传来的信息了!
所以只使用非对称加密是不可行的!
2.3 双方都使用非对称加密
- 服务端拥有公钥 S1 与对应的私钥 S2, 客户端拥有公钥 C1 与对应的私钥 C2
- 客户和服务端交换公钥
- 客户端给服务端发信息: 先用 S1 对数据加密, 再发送, 只能由服务器解密, 因为只有服务器有私钥 S2
- 服务端给客户端发信息: 先用 C1 对数据加密, 再发送, 只能由客户端解密, 因为只有客户端有私钥 C2
我们画图解释一下:
这样由于使用的是非对称加密,效率是比较低的!并且其实这种方案也怕中间人攻击,后面我们来讲!
2.4 非对称加密 + 对称加密
既然你说双方都使用非对称加密效率较低,那么我们使用对称加密+非对称加密的策略,效率是不是就更好了一些!
- 服务端具有非对称公钥 S1 和私钥 S2
- 客户端发起 https 请求, 获取服务端公钥 S1
- 客户端在本地生成对称密钥 C, 通过公钥 S1 加密, 发送给服务器.
- 由于中间的网络设备没有私钥, 即使截获了数据, 也无法还原出内部的原文, 也就无法获取到对称密钥(一样也怕中间人攻击! )
- 服务器通过私钥 S2解密,还原出客户端发送的对称密钥 C。并且使用这个对称密钥加密给客户端返回的响应数据。后续客户端和服务器的通信都只用对称加密即可。
- 由于该密钥只有客户端和服务器两个主机知道, 其他主机/设备不知道密钥即使截获数据也没有意义
我们来画图理解一下:
这样只需要在第一次通信时使用非对称加密,其余通信都是对称加密,所以效率可以保证了。
这样看似已经很安全了,但是也是有安全隐患的:中间人攻击。这个我们反复提了很多遍,这到底是什么东西,怎么就攻击性这么强,加密看似无懈可击,怎么还能被攻击?!
3 中间人攻击
中间人攻击:Man-in-the-MiddleAttack, 简称“MITM 攻击”。
我们所以的4中方案中,可以说最优的就是方案四。方案 4 中, 客户端获取到公钥 S1 之后, 对客户端形成的对称密钥 C,用服务端给客户端的公钥 S1进行加密, 中间人即使窃取到了数据, 此时中间人确实无法解出客户端形成的密钥 C, 因为只有服务器有私钥 S2,也就是说服务器才能解密出正确的对称密钥。
但是中间人的攻击, 如果在最开始握手协商的时候就进行了, 那就不一定了, 假设黑客已经成功成为中间人。那么事情就会变得十分有趣了:
- 首先,现在黑客已经作为了服务端和客户端的中间人,成为中间人的方式有很多(手机热点 , 假wifi ,假网站,平时大家要注意保护自己的信息安全)
- 中间人首先会接受到服务端向客户端以“明文”形式发送的公钥S1 , 这时他自身创建一对非对称密钥M1/M2,他将中间人公钥M1发送给客户端。
- 客户端收到中间人转发的信息,获得了中间人的公钥(客户端认为这就是服务端公钥)。然后客户端通过公钥M1将自身的对称密钥C加密后传输给中间人。
- 中间人通过私钥M2解密出来客户端的对称密钥,然后随便使用服务端密钥S1加密一些信息发送给服务端就行了。
- 至此,中间人的局已经做好,中间人拥有了进行通信的对称密钥!客户端发送的所有的信息都会被中间人劫持!并且服务端也会接收到使用公钥S1加密的数据!客户端和服务端都不会发出端倪!
这里最大的问题就是客户端无法知道获取的公钥是否可信,所以无论使用什么方案,都没有办法保证绝对的安全!因此就需要一些其他手段进行保护!
4 签名与CA证书
4.1 签名
签名的形成是基于非对称加密算法的, 注意, ⽬ 前暂时和 https 没有关系, 不要和https 中的公钥私钥搞混了:
进行发送数据时,无论是什么类型的数据,都可以通过散列函数(摘要算法)获取到一个散列值(数据摘要)。散列值通过签名者的私钥进行加密,这样的散列值具有唯一性!!!原始数据和散列值拼接到一起,获得到带有数字签名的数据。最终发送的数据就是带数字签名的数据!!!
接收到数据时,先将原始数据和签名分开,然后原始数据通过同样的散列算法再次获得到一个散列值。将签名通过签名者的公钥进行解密,新散列值和签名进行比较,最终就可以判断数据是否有被更改了!
这样就能保证数据不被更改了,因为这个世界上使用签名者有自己的私钥!也就意味着,只有签名者对数据具有签名的权利!其他人无法解开!
4.2 CA证书
CA 证书:即“证书授权中心”(Certificate Authority)证书 ,服务端在使用 HTTPS 前, 需要向 CA 机构申领一份数字证书, 数字证书里含有证书申请者信息、 公钥信息等。 服务器把证书传输给浏览器, 浏览器从证书里获取公钥就行了, 证书就如身份证, 证明服务端公钥的权威性!其主要功能是验证和证明公钥所有者的身份,确保公钥和特定实体(个人、组织、服务器等)之间的绑定关系是真实可靠的。
证书 可以理解成是一个结构化的字符串, 里面包含了以下信息:
- 证书发布机构
- 证书有效期
- 公钥
- 证书所有者
- 签名
- …
需要注意的是: 申请证书的时候, 需要在特定平台生成, 会同时生成一对密钥对, 即公钥和私钥。 这对密钥对就是用来在网络通信中进行明文加密以及数字签名的。
其中公钥会随着 CSR 文件, 一起发给 CA 进行权威认证, 私钥服务端自己保留, 用来后续进行通信(其实主要就是用来交换对称密钥)。
通过CA证书,客户端可以知道公钥是否合法,是否是目标网址!并且因为其带有签名,所以就算会是明文信息,中间人更改会造成签名不对等,从而被识破!
5 https通信最终方案
https最终的通信方案是:非对称加密 + 对称加密 + 证书认证!
服务端会先去CA认证机构申请证书,来保证其可以进行通信!
在客户端和服务器刚一建⽴连接的时候,服务器给客户端返回一个CA证书, 证书包含了之前服务端的公钥, 也包含了网站的身份信息。这样客户端就可以识别公钥是否合法:
客户端进行认证:当客户端获取到这个证书之后, 会对证书进行校验(防止证书是伪造的).
- 判定证书的有效期是否过期。
- 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)。
- 验证证书是否被篡改:从系统中拿到该证书发布机构的公钥,对签名解密,得到一个 散列值(称为数据摘要),设为 hash1。然后计算整个证书的散列值,设为 hash2. 对比 hash1 和 hash2 是否相等。如果相等,则说明证书是没有被篡改过的
中间人有没有可能篡改该证书?
- 中间人篡改了证书的明文
- 由于他没有 CA 机构的私钥, 所以无法 hash 之后用私钥加密形成签名, 那么也就没法办法对篡改后的证书形成匹配的签名
- 如果强行篡改, 客户端收到该证书后会发现明文和签名解密后的值不一致, 则说明证书已被篡改, 证书不可信, 从而终止向服务器传输信息, 防止信息泄露给中间人 !
中间人整个掉包证书?
- 因为中间人没有 CA 私钥, 所以无法直接制作假的证书,必须去CA机构申请!
- 所以中间人只能向 CA 申请真证书, 然后用自己申请的证书进行掉包
- 这个确实能做到证书的整体掉包, 但是别忘记, 证书明文中包含了域名等服务端认证信息, 如果整体掉包, 客户端依旧能够识别出来。
永远记住: 中间人没有 CA 私钥, 所以对任何证书都无法进行合法修改, 包括自己的!
CA证书验证解决了中间人掉包公钥的问题,保证了客户端可以获取正确的公钥!并且通过数字签名,可以保证传输证书过程中中间人无法修改证书的明文信息,因为中间人没有证书的私钥,无法形成正确的签名!在客户端验证签名时就会出错!
这样我们就理解了https协议是如何保证网络安全通信的了!!!
相关文章:

【计网】从零开始认识https协议 --- 保证安全的网络通信
在每个死胡同的尽头, 都有另一个维度的天空, 在无路可走时迫使你腾空而起, 那就是奇迹。 --- 廖一梅 --- 从零开始认识https协议 1 什么是https协议2 https通信方案2.1 只使用对称加密2.2 只使用非对称加密2.3 双方都使用非对称加密2.4 …...
Ubuntu安装 MySQL【亲测有效】
在Ubuntu上安装MySQL数据库的步骤通常包括更新软件包列表、安装MySQL服务器、启动并配置MySQL服务等。以下是一个详细的安装指南: 一、更新软件包列表 首先,打开终端并输入以下命令来更新Ubuntu的软件包列表: sudo apt update二、安装MySQ…...

Unity 从零开始搭建一套简单易用的UGUI小框架 扩展与优化篇(完结)
一个通用的UGUI小框架就算是写完了,下面是一步步的思考与优化过程 Unity 从零开始搭建一套简单易用的UGUI小框架 基础分析篇-CSDN博客 Unity 从零开始搭建一套简单易用的UGUI小框架 功能撰写与优化篇-CSDN博客 从使用者的角度来整理一下可能会发出的疑问 0. Panel…...
MySQL多表操作--外键约束多表关系
外键约束介绍 Mysql外键约束(foreign key)是表的一个特殊字段,常与主键约束一起使用。外键约束是一种用于维护两个表之间数据一致性的方法。它确保引用表中的每个值都存在于主表中的某个列中。外键约束通常用于实现数据库的参照完整性。对于两…...
【python入门到精通专题】8.装饰器
装饰器是python语言中的语法糖,可以通过装饰器对函数的功能进行拓展。 为什么需要装饰器 我们假设你的程序实现了say_hello()和say_goodbye()两个函数。 def say_hello():print("hello!")def say_goodbye():print("hello!") # 此处应打印go…...

Halcon Blob分析提取小光斑
文章目录 算子complement 返回一个区域的补集select_region_point 选择包含指定像素的所有区域intensity 计算灰度值的均值和偏差 案例 算子 complement 返回一个区域的补集 complement(Region : RegionComplement : : )Region (输入对象):这指的是输入的一个或多…...
Lua
1.声明一个变量 只要赋值一个变量,就相当于新建了一个变量,默认全局变量,加一个local前缀之后,这个变量就变成了局部变量 a1//全局变量 local b2//局部变量2.nil类型 在Lua里没有被声明过的变量都是nil,nil是一种类…...

模型 总观效应
系列文章 分享 模型,了解更多👉 模型_思维模型目录。超越自我,洞见生命之渺小。 1 总观效应的呈现和应用 1.1 回首创业路,星辰大海的启示 陈浩是一名连续创业者,他的创业历程充满了起伏和挑战。在经历了几次失败后&a…...

【HarmonyOS NEXT】实现页面水印功能
关键词:鸿蒙、水印、Watermark、页面、触摸问题 注:本期文章同样适用 OpenHarmony 的开发 在app开发过程中时常会出现敏感信息页面,为保护信息安全和及时的数据追踪,通常会采用给页面加水印的形式,那么本期文章会介绍…...

selenium自动化测试之Junit
1. 常用的注解 将junit的索引添加到pom文件: <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId&…...

【氮化镓】基于氮化镓的互补逻辑集成电路[Nature Electronics]
【摘要】本文介绍了一种基于氮化镓(GaN)的互补金属氧化物半导体(CMOS)逻辑集成电路,该电路利用氧等离子体处理技术实现了增强型n沟道和p沟道GaN场效应晶体管的单片集成。研究者们展示了包括反相器、与非门、或非门和传输门在内的基本逻辑门,以及多级逻辑电路,如锁存器和…...

Linux之如何找回 root 密码?
1、启动系统,进入开界面,在界面中按“e"进入编辑界面 2、进入编辑界面,使用键盘上的上下键把光标往下移动,找到以”Linux16“开通内容所在的行数,在行的最后面输入:init/bin/sh 3、输入完成后&…...
后端参数校验方式
1. 使用Hibernate Validator进行注解校验 这是Java中最常用的参数校验方式,基于JSR 303/JSR 380规范的实现,通常结合Valid或Validated注解进行参数校验。 使用步骤: 添加依赖(如果使用Spring Boot,通常已经内置了Hi…...

访问控制列表(课内实验)
实验2:访问控制列表 实验目的及要求: 通过实验,进一步的理解标准ACL与扩展ACL的工作原理及执行过程。理解通配符的概念,熟练掌握标准ACL与扩展ACL的配置指令,掌握将访问控制列表应用VTY线路上,并且能够判断…...

处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优
处理Java内存溢出问题(java.lang.OutOfMemoryError):增加JVM堆内存与调优 在进行压力测试时,遇到java.lang.OutOfMemoryError: Java heap space错误或者nginx报错no live upstreams while connecting to upstream通常意味着应用的…...
数据分析库Pandas
一、认识Pandas数据分析库 Pandas是一个功能强大的数据分析库,它提供了丰富的数据结构和函数来处理和分析表格数据。在处理类似您提供的Excel文件时,首先需要导入Pandas库并读取数据,然后进行数据清洗和预处理,最后进行数据分析和…...
nginx做负载均衡的策略有哪些和模块
文章目录 策略模块 策略 轮询:轮询是Nginx默认的负载均衡策略,每个请求会按时间顺序分配到不同的后端服务器。这种方式适用于服务器配置相当且无状态的服务场景。加权轮询:在轮询的基础上,通过设置权重来调整不同服务器处理请求的…...

基于SSM社区医院预约转诊管理系统JAVA|VUE|Springboot计算机毕业设计源代码+数据库+LW文档+开题报告+答辩稿+部署教+代码讲解
源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储:…...
Android适配器更改,ListView未收到通知解析
只需要在每次适配器发生变化时,调用函数adapter.notifyDataSetChanged(); 其中的adapter是适配器名。 需要说明的适配器对应的数组:List<String>也是适配器的一部分。 如:以下代码中的lists数组 List<T> lists new ArrayLis…...

ubuntu18.04系统中图形化界面
一、Ubuntu 18.04 中,使用 GDM 作为默认的图形用户界面(GUI)管理器。GDM 是 GNOME Display Manager 的缩写,它是用于 Ubuntu 的显示管理器,负责处理登录和会话管理。 通过命令行重启 Ubuntu 18.04 上的图形界面服务&am…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...

Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...