【HTTPS】采用的加密策略, 什么是中间人攻击? 什么是证书?

news2024/11/26 20:28:26

文章目录

  • 前言
  • 一、认识 HTTPS 协议
    • 1, 对称加密
    • 2, 非对称加密
  • 二、HTTPS 加密策略
    • 1, 只采用对称加密 : 不安全
    • 2, 引入非对称加密
    • 3, 中间人攻击之偷梁换柱
    • 4, 引入证书
      • 4.1 什么是证书
      • 4.2, 证书如何能解决"中间人攻击"
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

上篇文章介绍了如何构造一个 HTTP 请求, 本篇主要介绍关于 HTTPS 加密的的相关知识在这里插入图片描述


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、认识 HTTPS 协议

目前绝大部分网站都使用了 HTTPS 协议, HTTPS 可以理解为在 HTTP 协议的基础上, 增加了一个加密层

正由于 HTTP 协议内容都是按照文本的方式明文传输的, 这就导致在传输过程中出现一些被篡改的情况, 比如被黑客盗取传输信息, 运营商劫持等等

HTTPS 就是尽可能确保互联网上的数据传输的安全性, 设计了加密机制

加密已经发展成复杂的, nb 的 “密码学”, 本篇不介绍具体的加密算法, 只介绍策略

  • 加密 : 明文, 通过一些复杂的数学算法(密匙) --> 密文
  • 解密 : 密文, 通过一些复杂的数学算法(密匙) --> 明文

1, 对称加密

简单来说 : 加密的密钥和解密的密钥是同一个, 所以采用对称加密, 密钥既能加密也能解密

我们把对称密钥称为 Key :

  • 加密 : 明文 通过 Key --> 密文
  • 解密 : 密文 通过 Key --> 明文

2, 非对称加密

简单来说 : 有两把密匙, 一把对外公开的公钥, 一把不对外公开的私钥, 公钥和私钥配对, 公钥用来加密, 私钥来解密

我们把公钥称作 publicKey, 私钥称作 privateKey

  • 加密 : 明文 通过 publicKey --> 密文
  • 解密 : 密文 通过 privateKey --> 明文

注意 : 公钥和私钥是配对的, 也是相对的!!! 这两把密匙, 都可以用来加密或者解密, 完全可以使用私钥加密, 使用公钥解密, 只是把用来加密的密钥公开, 用来解密的密钥私有, 这才有了公钥私钥之分

非对称加密的好处就是 : 即便别人知道我加密的方式, 也不能解密, 只能干瞪眼!!, 因为解密需要私钥啊, 私钥是我私藏的, 只有我知道

但坏处是 : 由于公钥私钥设计成配对的, 导致加密解密时运算复杂, 比较耗时


二、HTTPS 加密策略

接下来, 我们层层递进的分析 HTTPS 如何尽可能保证数据安全

1, 只采用对称加密 : 不安全

我们把对称密钥称为 Key :

  • 加密 : 明文 通过 Key --> 密文
  • 解密 : 密文 通过 Key --> 明文

使用对称加密的方式传输密文 :

在这里插入图片描述

这样即便是中间有黑客, 黑客截取到了数据, 如果没有拿到密钥 Key, 也无法解密, 但同理, 服务器如果没有拿到密钥 Key, 服务器也无法解密

所以在此之前, 客户端要先把 Key 传给服务器

对称加密的密钥 Key, 是客户端生成的, 因为一个服务器可能要和无数个客户端通信, 每个客户端的密钥 Key 都不能相同, 这就需要客户端自己生成自己的密钥 Key

在这里插入图片描述
这样确实是把 Key 告知给服务器了, 接着再传输密文, 服务器就可以解密了, 但同理黑客也知道了 Key ! 黑客也能解密 ! ! 因为 Key 是明文传输的 ! !

那咋办呢? 想让客户端知道 Key, 又不想让黑客知道, 难道再生成一个 Key2, 用 Key2 加密 Key 吗? 如果可以, 那 Key2 怎么传输? 显然这是套娃

所以此路不通, 问题是Key 无法安全传输, 这就需要引入非对称加密 ! !


2, 引入非对称加密

我们把公钥称作 publicKey, 私钥称作 privateKey

  • 加密 : 明文 通过 publicKey --> 密文
  • 解密 : 密文 通过 privateKey --> 明文

对称密钥 Key 是客户端生成的, 非对称密钥是服务器生成的(公钥对外公开, 私钥只有服务器自己知道)

非对称加密可以做到客户端安全的传输 Key , 不被黑客截取 ! !

在这里插入图片描述

首先, 客户端有一个对称密钥 Key, 服务器有一对儿非对称密钥 publicKey 和 privateKey

1, 客户端获取 publicKey

在这里插入图片描述
黑客没拿到有用的信息, 只能转发消息


2, 服务器返回 publicKey

在这里插入图片描述
客户端收到信息, 拿到了 publicKey , 但黑客也拿到了


3, 客户端使用非对称加密传输 Key

在这里插入图片描述
注意 ! ! !
此时 Key 不再是明文传输了, 而是被服务器的 publicKey 加密了, 即便黑客截取了这个被加密的 Key, 也不能解密, 因为解密需要与 publicKey 配对的 privateKey ! ! 所以即便刚刚黑客截取了服务器发给客户端的 publicKey 也无用武之地

黑客没有 privateKey, 客户端也没有, 除了服务器之外的任何一台主机都没有 ! ! 所以只有服务器(使用 privateKey 解密之后)知道客户端的对称密钥 Key 是什么


4, 客户端使用对称加密传输数据

在这里插入图片描述
服务器拿到 Key 之后, 后续客户端通过 Key 加密数据, 服务器自然也可以使用 Key 解密


综上所述,
1, 原本客户端只有 Key, 服务器只有 publicKey 和 privateKey, 但最后客户端拿到了对方的 publicKey, 服务器安全的拿到了对方的 Key
2, 非对称加密传输 Key, 对称加密传输数据报, 因为非对称加密比较费时, 只使用一次就可以后续安全地频繁使用性能更高地加密方式

但是, 这就万事大吉了吗? 黑客也有"骗"的方式


3, 中间人攻击之偷梁换柱

起初还是客户端有一个对称密钥 Key, 服务器有一对儿非对称密钥 publicKey 和 privateKey

1, 客户端获取 publicKey

在这里插入图片描述
黑客没拿到有用的信息, 只能转发消息


2, 服务器返回 publicKey, 黑客偷梁换柱 ! !

在这里插入图片描述
当黑客拿到了服务器打算发给客户端的 publicKey 之后, 黑客做坏事了 : 自己生成了一对 publicKey 和 privateKey, 把自己的 publicKey 发给客户端, 让客户端以为黑客的 publicKey 就是服务器发给他的 publicKey

在这里插入图片描述

此时黑客手上有三把密匙 : 自己的 publicKey , privateKey, 和服务器的 publicKey


3, 客户端使用非对称加密传输 Key

在这里插入图片描述
客户端完全不知道发生了什么, 使用黑客的 publicKey 加密 Key 传输给服务器, 被黑客拦截后, 黑客可以使用自己的 privateKey 解密, 从而盗取 Key

如果原封不动的转发给服务器, 服务器无法解密了(因为不是使用服务器的 publicKey 加密的, 服务器的 privateKey 就用不了)

为了防止服务器发现异常, 黑客就要把 Key 使用服务器的 publicKey 加密, 发给服务器

在这里插入图片描述

此时黑客手上有四把密匙 : 自己的 publicKey , privateKey, 服务器的 publicKey, 和客户端的对称密钥 Key


4, 客户端使用对称加密传输数据

在这里插入图片描述

由于黑客已经有了对称密钥 Key, 等客户端傻呵呵的发来了使用 Key 加密的密文, 黑客也能解开, 从而盗取数据


上述过程, 被称作中间人攻击
1, 黑客骗过了客户端, 让客户端以为自己的 publicKey 就是服务器的 publicKey, 所以黑客才能盗取客户端的 Key, 其实本质就是黑客冒充了服务器的身份
2, 自始至终, 客户端都没能拿到服务器的 publicKey

解决中间人攻击的方式也很简单, 在客户端拿到 publicKey 的时候, 必须要让客户端信任这个 publicKey 是正品, 然后才能把自己的对称密钥 Key 交出去


4, 引入证书

4.1 什么是证书

服务器要想支持 HTTPS 协议, 就要找到证书颁布机构申请一个证书, 证书不是实体的, 可以理解成一个结构化的字符串, 里面包含了以下信息 :

  • 证书发布机构
  • 证书有效期
  • 证书所有者
  • 证书所有者的公钥
  • 加密的签名(除了这个, 其他的字段都是明文的)

签名就是一个"校验和", 针对证书中的各种字段, 使用特殊的算法得出一个值, 然后再用证书颁布机构的私钥对签名加密

证书颁布机构也有一对公钥和私钥, 任何一个正经的主机的操作系统中都内置了机构的公钥

上面说过, 公钥可以加密, 私钥解密, 也可以私钥加密, 公钥解密, 只是对外公开的称作公钥

在浏览器 – 设置 – 搜索"证书" – 证书管理 :

在这里插入图片描述
在这里插入图片描述


4.2, 证书如何能解决"中间人攻击"

客户端可以通过以下方式判断证书是不是"正品" :

  • 证书的有效期是否过期
  • 证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)
  • 证书是否被篡改 : 客户端从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数据摘要), 这是机构已经算好的, 设为 hash1. 然后客户端使用相同的算法, 计算整个证书的 hash 值, 设为 hash2, 这是客户端自己算的. 对比 hash1 和 hash2 是否相等. 如果相等, 则说明证书是没有被篡改过的

在这里插入图片描述

有了证书之后, 客户端直接向服务器索要证书即可, 因为证书里包含服务器的私钥

**加粗样式**

黑客要是还想再用刚才的方式"偷梁换柱", 就不行了, 因为客户端首先能看到的就是黑客发来的 publicKey证书里的 publicKey 不一样

黑客能不能篡改证书里的 publicKey, 篡改证书所有者呢?

  • 证书本质就是个字符串, 黑客当然可以把篡改字符串里的值, 黑客的操作系统中也有机构的公钥, 所以也可以轻松的把加密的签名使用发布机构的公钥解密, 然后篡改签名
  • 但是黑客无法再针对篡改后的签名加密, 因为黑客没有发布机构的私钥 ! !, 这一步做不到, 签名的值就无法真正的被修改, 即便改了其他字段, 等到客户端自己校验的时候就会发现不对劲

所以黑客完全能看到证书里的所有信息, 但是改不了, 无能为力, 只能干瞪眼


总结

以上就是本篇的全部内容, 主要介绍了 HTTPS 是如何保证数据安全传输的, 仅仅使用对称加密, 无法安全传输 Key, 使用非对称加密即可, 但会有"中间人攻击"风险, 所以引入证书, 通过校验证书能够判断对端是否值得信任, 整个复杂的机制都是为了确保安全的传输Key, 然后才能传输数据

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

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

相关文章

日历与时钟

目录 公历 黑色星期五 生物韵律 公历 在公历中,当年份为4的整数倍,但不是100的整数倍时,会出现闰年的现象。 y40 mod(y,4) 0 && mod(y,100)||mod(y,400)0 输出当时的年、月、日、时、分、秒 f%6d %6d %6d %6d %6d %9.3f\n cclock …

MySQL学习基础篇(八)---聚合函数

MySQL学习基础篇(八)—聚合函数 聚合(或聚集、分组)函数,它是对一组数据进行汇总的函数,输入的是一组数据的集合,输出的是单个值。 1. 聚合函数介绍 什么是聚合函数:聚合函数作用于一组数据,…

前端实战——尚品汇(网页开发)

/* 基础设置 */ .container {width: 1190px;margin: 0 auto; } /* #region顶部导航条start */ .topbar {height: 30px;background-color: #ececec; } .welcome {height: 30px;line-height: 30px;font-size: 0;color: #666; } .welcome span,.welcome a {font-size: 12px; } .we…

AIGC - Stable Diffusion WebUI 图像生成工具的环境配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/131528224 Stable Diffusion WebUI 是一款基于深度学习的图像生成工具,根据用户的输入文本或图像,生成高质量的新图像&…

关于VMware虚拟空间的创建、Linux系统的安装

文章目录 前言一、Windows用户安装VMware软件1.1 下载VMware1.2 正常安装VMware后,该软件是要收费的,但是下面的链接可以让你使用很久 二、Mac用户安装VMware软件2.1 下载macOS版本:VMware Fusion2.2 正常安装VMware后,该软件是要…

「2024」预备研究生mem-形式逻辑强化:推矛盾

一、推矛盾 易错题:重点 重点: 二、课后题 三、每日一练

新版本vscode使用配置文件功能,解决不同项目使用不同的插件

如果你同时有vue2,vue3的项目。一定会遇到插件的问题。因为vue2项目插件是使用vetur的,vue3是使用volar的。 以前vscode为了在不同项目中能使用不同的配置文件,是使用工作区的概念去解决的,但是比较复杂而且不好用。 现在新版本的vscode&…

【温故而知新】Android架构模式

Android项目工程中常用的架构模式有MVC, MVP, MVVM以及现在新出的MVI。 下面一起温故而知新。 MVC MVC(Model-View-Controller)是一种在Android应用程序中使用的架构模式,用于实现松耦合、可测试和可维护的应用程序。 MVC架构模式包括三个…

高级篇十六、多版本并发控制(重要)

目录 1、什么是MVCC2、快照读与当前读2.1 快照读2.2 当前读 3、复习3.1 隔离级别3.2 隐藏字段、Undo Log版本链 4、MVCC实现原理之ReadView4.1 什么是ReadView? 1、什么是MVCC MVCC (Multiversion Concurrency Control),多版本并…

Django之ORM的锁,开启事务,Ajax

一、行锁 select_for_update(nowaitFalse, skip_lockedFalse) 注意必须用在事务里面,至于如何开启事务,我们看下面的事务一节 Book.objects.select_for_update().filter(nid3) # 锁住nid3的行select_for_update中的两个参数了解即可,因为在…

机器学习入门

AI人工智能 ANI 弱人工智能,狭义人工智能,指的是一种针对特定任务或领域进行优化的人工智能,例如语音识别、图像识别、自然语言处理、推荐系统 AGI 通用人工智能,强人工智能, ASI 超级人工智能,超人工智…

Erupt框架学习

Erupt框架学习 Erupt框架Erupt简介学习EruptEruptFieldErupt的逻辑删除Erupt的自定义按钮多数据源配置 Erupt框架 Erupt简介 最近因为工作所以接触到了一个低代码框架Erupt。这是一个通用的配置管理框架,主打就是零前端代码,急速开发通用管理框架。 Er…

C# 如何调用python,避免重复造轮子

文章目录 原因资源调用python文件需求解决方案1、C#里面运行python引入python文件,再调用其中的方法启动python脚本,监听返回值改造一下,可以入参的python调用查看是否等待python运行完成之后再运行C#如果参数比较复杂 开一个python网络后端 …

如何用Airtest脚本无线连接Android设备?

1. 前言 之前我们已经详细介绍过如何用AirtestIDE无线连接Android设备: 手把手教你用AirtestIDE无线连接手机! ,它的关键点在于,需要先 adb connect 一次,才能点击 connect 按钮无线连接上该设备: 但是有很…

​浅谈大型语言模型

大型语言模型(Large Language Models,LLMs)是一类强大的人工智能模型,具有出色的自然语言处理能力。它们在许多任务中表现出色,如机器翻译、文本摘要、对话生成和情感分析等。下面我们将介绍大型语言模型的训练和生成过…

海康监控摄像机接入NTV GBS GB28181平台实现远程调取监控视频

海康威视各种型号监控摄像头或硬盘录像机(NVR/HVR)接入NTV GBS GB28181平台配置过程都非常简单明了,但有些细节需要注意,避免走弯路踩泥坑。 1、基本要求 1)网络要求 总体来说,只要监控设备和GB28181平台的网络是连通的,设备可以主…

MATLAB基础篇(上)

一、MATLAB简介 MATLAB(Matrix Laboratory, 即矩阵实验室)是MathWork公司推出的一套高效率的数值计算和可视化软件.MATLAB是当今科学界最具影响力、也是最具活力的软件, 它起源于矩阵运算, 并已经发展成一种高度集成的计算机语言.它提供了强大的科学运算、灵活的程序设计流程、…

保姆级python环境配置(anaconda+pycharm+cuda+cudnn+pytorch)

文章目录 前言一、如何下载anaconda1、下载网址2、版本选择3、下载流程4、注意事项 二、如何下载pycharm1、下载网址2、下载流程 三、更新NVIDIA驱动1、下载网址2、选择相应配置进行下载 四、如何下载cuda1、查看可安装的cuda版本号2、下载网址3、下载流程4、注意事项 五、如何…

牛客网数据库sql实战基础知识

sql基础知识 1.concat(a,“-”,b): 将a和b列,连接成字符串,用-分割后输出成一列。(分隔符在参数中间) 2.insert into values(),(): 插入多列时用逗号分割,不需要在最外层加再加括号。 3.inse…