【计网】从零开始认识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协议中的httpRequesthttpResponse。进行通信时,浏览器(客户端)会向服务端发送请求,请求中的所有信息(请求行 ,URL ,cookie ,正文…)都是明文。明文是没有进行过加密的信息,那么就会造成一些安全问题。

  1. 客户端与服务端进行通信不是直接进行通信的,而是通过第三方的运营商进行信息的中转。
  2. 作为中间人的运营商就能够看到客户端和服务端通信的信息是是什么,这样势必会造成用户隐私的泄漏!
  • 大庆警方破获的DNS劫持案:这是全国首起涉及通信运营商DNS劫持的案件。案件中,犯罪团伙通过与通信运营商内部人员勾结,在运营商机房内架设了镜像数据服务器,并安装了“劫持程序”。这导致上网用户流量被非法控制,并强制跳转到指定的网页。该案涉及21人,是一个大规模的网络犯罪团伙。
  • 流量劫持案例:2014年年底,沈文等人通过域名和流量劫持非法牟利。他们通过技术操作捕获不特定上网用户的实时上网流量,并完成用户域名跳转的劫持操作。这种行为不仅给网民带来不便,也对互联网企业的正常运营造成影响。最终,沈文等人被判处有期徒刑11年,并处罚金10万元。

为了避免这样的问题,最要紧的就是将信息进行加密,把明文转换为密文,这样运营商就不会轻易的获取到客户端与服务端之间的信息了!而由此诞生的就是https协议!https协议中会进行一些加密算法:

  1. 对称加密:采用单钥密码系统的加密方法, 同一个密钥可以同时用作信息的加密和解密, 这种加密方法称为对称加密, 也称为单密钥加密。
    • 特征: 加密和解密所用的密钥是相同的
    • 常见对称加密算法(了解): DES、 3DES、 AES、 TDEA、 Blowfish、 RC2 等
    • 特点: 算法公开、 计算量⼩、 加密速度快、 加密效率⾼
  2. 非对称加密:需要两个密钥来进行加密和解密, 这两个密钥是公开密钥(public key, 简称公钥) 和私有密钥(private key, 简称私钥) 。
    • 特征:非对称加密要用到两个密钥, 一个叫做 “公钥”, 一个叫做 “私钥”。公钥和私钥是配对的。 最大的缺点就是运算速度非常慢, 比对称加密要慢很多。
    • 常见非对称加密算法(了解): RSA, DSA, ECDSA
    • 特点: 算法强度复杂、 安全性依赖于算法与密钥但是由于其算法复杂, 而使得加密解密速度没有对称加密解密的速度快。

当然仅仅通过加密算法,还是不能保证安全,需要使用相应的策略!

2 https通信方案

2.1 只使用对称加密

如果通信双方都各自持有同一个密钥 X, 且没有别人知道, 双方就可以通过密钥加密与解密,而作为中间人由于不知道密钥,无法获取真正的信息,所以这两方的通信安全当然是可以被保证的(除非密钥被破解)。

但是,矛盾的一点是:如何让双方都持有同一个密钥?

  • 如果每次通信,第一次进行时都由客户端(浏览器)将密钥交给服务端,注意这里的密钥在通信中也是进行了加密。服务端收到信息之后,根本就还没获得密钥,又如何将密钥从信息中解密出来呢?
  • 如果不将密钥进行加密传输,直接把密钥明文传输, 那么中间人也就能获得密钥了,此时后续的加密操作就形同虚设了!

所以只使用对称加密是不可行的!

2.2 只使用非对称加密

鉴于非对称加密的机制:**需要客户端和服务端分别持有公钥和私钥。**那么想要进行通信的话就也需要将密钥进行通信!

  • 如果服务器先把公钥以明文方式传输给浏览器, 之后浏览器向服务器传数据前都先用这个公钥加密好再传, 从客户端到服务器信道似乎是安全的(其实也是有安全问题的,后面讲解中间人攻击), 因为只有服务端有相应的私钥能解开公钥加密的数据。但是服务器到浏览器的这条路怎么保障安全?
  • 如果服务器用它的私钥加密数据传给浏览器, 那么浏览器用公钥可以解密它, 而这个公钥是一开始通过明文传输给浏览器的, 若这个公钥被中间人劫持到了, 那他也能用该公钥解密服务器传来的信息了!

所以只使用非对称加密是不可行的!

2.3 双方都使用非对称加密

  1. 服务端拥有公钥 S1 与对应的私钥 S2, 客户端拥有公钥 C1 与对应的私钥 C2
  2. 客户和服务端交换公钥
  3. 客户端给服务端发信息: 先用 S1 对数据加密, 再发送, 只能由服务器解密, 因为只有服务器有私钥 S2
  4. 服务端给客户端发信息: 先用 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,也就是说服务器才能解密出正确的对称密钥。

但是中间人的攻击, 如果在最开始握手协商的时候就进行了, 那就不一定了, 假设黑客已经成功成为中间人。那么事情就会变得十分有趣了:

  1. 首先,现在黑客已经作为了服务端和客户端的中间人,成为中间人的方式有很多(手机热点 , 假wifi ,假网站,平时大家要注意保护自己的信息安全)
  2. 中间人首先会接受到服务端向客户端以“明文”形式发送的公钥S1 , 这时他自身创建一对非对称密钥M1/M2,他将中间人公钥M1发送给客户端。
  3. 客户端收到中间人转发的信息,获得了中间人的公钥(客户端认为这就是服务端公钥)。然后客户端通过公钥M1将自身的对称密钥C加密后传输给中间人。
  4. 中间人通过私钥M2解密出来客户端的对称密钥,然后随便使用服务端密钥S1加密一些信息发送给服务端就行了。
  5. 至此,中间人的局已经做好,中间人拥有了进行通信的对称密钥!客户端发送的所有的信息都会被中间人劫持!并且服务端也会接收到使用公钥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协议是如何保证网络安全通信的了!!!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP协议栈

一、TCP/IP和OSI模型的比较 相同点 两者都是以协议栈的概念为基础 协议栈中的协议彼此相互独立 下层对上层提供服务 不同点 OSI是先有模型;TCP/IP是先有协议,后有模型 OSI是国际标准,适用于各种协议栈;TCP/IP实际标准&…

论文笔记:Pre-training to Match for Unified Low-shot Relation Extraction

论文来源:ACL 2022 论文地址:https://aclanthology.org/2022.acl-long.397.pdf 论文代码:https://github.com/fc-liu/MCMN (笔记不易,请勿恶意转载抄袭!!!) 目录 A…

外卖点餐系统小程序的设计

管理员账户功能包括:系统首页,个人中心,外卖员管理,餐厅管理,用户管理,菜品分类管理,菜品信息管理,外卖订单管理,订单配送管理 微信端账号功能包括:系统首页…

linux下编译鸿蒙版curl、openssl

一.环境准备 1.参考说明 NDK开发介绍:https://docs.openharmony.cn/pages/v5.0/zh-cn/application-dev/napi/ndk-development-overview.md 2.NDK下载 点击介绍页面中的链接可以跳转到相应下载页面: 下载相应版本: 下载完毕后解压到指定目…

.NET 通过C#设置Excel工作表的页面设置

Excel文件数据准备就绪并需要以报告形式呈现时,调整Excel文件的页面设置变得尤为重要,不仅关乎文档的专业外观,还直接影响到打印或电子分享时的可读性和实用性。通过C#来自动化这一过程,不仅可以节省大量手动配置的时间&#xff0…

python 画图|三维散点图输出

【1】引言 在前述学习进程中,已经初步掌握三维动画输出和散点图动画输出基本技能,可通过下述链接直达: python画图|散点图动态输出-CSDN博客 python动画教程|Animations using Matplotlib-官网教程程序解读_如何用python制作微动画-CSDN博…

Docker 教程四 (Docker 镜像加速)

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。 目前国内 Docker 镜像源出现了一些问题,基本不能用了,后期能用我再更新下。* Docker 官方和国内很多云服务商都提供了国内加速器服务,例如…

STM32 SPI串行总线

目录 STM32的SPI通信原理 SPI串行总线概述 SPI串行总线互连方式 STM32F1 SPI串行总线的工作原理 SPI串行总线的特征 SPI串行总线的内部结构 SPI串行总线时钟信号的相位和极性 STM32的SPI接口配置 STM32的SPI接口数据发送与接收过程 SPI的HAL 驱动函数 STM32的SPI通信…

vue+ElementUI—实现基础后台管理布局(sideBar+header+appMain)(附源码)

后台管理的模板很多,vue本身就提供了完整的vue-template-admin,vue-admin-beautiful等后台管理系统化框架,但是这些框架正是因为成体系而显得繁重。假如你想搭建一个静态的后台管理模板页面和几个单独的菜单页面,直接就上框架是否…

STM32CubeIDE使用ADC采用DMA重大BUG

问题描述 STM32CubeIDE 1.8.0问题 大牛攻城狮最近调试STM32L151CBT6。由于项目上使用该款芯片做控制电源使用,其中涉及到多路ADC的数据采样。使用STM32CubeIDE 1.8.0版本详细如下图所示 注意这里的使用的软件版本号很关键。采用该款软件搭建工程,第一次…

物联网如何推动工业数字化转型?

全球步入数字经济时代,制造业的数字化转型已成为驱动经济发展的核心引擎。物联网作为工业数字化转型的强力推手,其深度融入不仅促进了生产流程的智能化与自动化,还实现了数据的实时分析与精准决策,为制造业企业带来了前所未有的创…

基于Langchain框架下Prompt工程调教大模型(LLM)[输入输出接口、提示词模板与例子选择器的协同应用

大家好,我是微学AI,今天给大家介绍一下基于Langchain框架下Prompt工程调教大模型(LLM)[输入输出接口、提示词模板与例子选择器的协同应用。本文深入探讨了Langchain框架下的Prompt工程在调教LLM(大语言模型)方面的应用&#xff0c…

高效微调理解(prompt-tuning,p-tuning v1,p-tuning v2,lora)

高效微调(prompt-tuning,p-tuning v1,p-tuning v2,lora) 1.prompt-tuning: 例子理解;保持原本模型参数不变,通过训练提示词的参数调整prompt,使其与下游任务匹配。 例子…

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作)

SpringBoot教程(二十四) | SpringBoot实现分布式定时任务之Quartz(动态新增、修改等操作) 前言数据库脚本创建需要被调度的方法创建相关实体类创建业务层接口创建业务层实现类控制层类测试结果 前言 我这边的SpringBoot的版本为2…

用java来编写web界面

一、ssm框架整体目录架构 二、编写后端代码 1、编写实体层代码 实体层代码就是你的对象 entity package com.cv.entity;public class Apple {private Integer id;private String name;private Integer quantity;private Integer price;private Integer categoryId;public…

libaom 源码分析系列:noise_model.c 文件

libaom libaom 是 AOMedia(开放媒体联盟)开发的一个开源视频编解码器库,它是 AV1 视频压缩格式的参考实现,并被广泛用于多种生产系统中。libaom 支持多种功能,包括可扩展视频编码(SVC)、实时通信(RTC)优化等,并定期进行更新以提高压缩效率和编码速度 。 libaom 的一些…

2.1 HTML5 - Canvas标签

文章目录 引言Canvas标签概述定义实例:创建画布 理解Canvas坐标系概述实例:获取Canvas坐标 获取Canvas环境上下文概述实例:获取Canvas上下文设置渐变色效果 结语 引言 大家好,今天我们要一起探索HTML5中一个非常有趣且强大的特性…

Redhat的yum源出错——如何将yum源换成阿里云Centos源

文章目录 引言1. 查看和删除已安装的yum包2. 查看系统的版本号3. 镜像文件下载4. 镜像文件安装5. 下载和安装repo文件6. 配置repo文件7. 更新软件包缓存8. 验证9. 问题问题1 参考文献 Linux RedHat更换阿里云yum源 Redhat8.0 yum install问题解决 阿里云镜像 引言 为什么redha…

六西格玛黑带项目:TBX-02无人机飞行稳定性提升——张驰咨询

一、项目背景与问题定义 TBX-02是该公司最新发布的消费级无人机,面向摄影爱好者和户外探险者。产品上市后,通过客户反馈和实际测试数据发现,该无人机在复杂飞行环境中,如强风或快速移动时,存在明显的飞行抖动和稳定性…

【AIGC】OpenAI API在快速开发中的实践与应用:优化ChatGPT提示词Prompt加速工程

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯使用最新型号确保最佳实践利用最新模型进行高效任务处理为什么要选择最新模型?结论 💯指令与上下文的分隔最佳实践分隔指令和上下文的重要性使用符…