当前位置: 首页 > news >正文

HTTPS加密

一.加密是什么

加密就是把明文(要传输的信息)进行一系列的变换,生成密文.

有加密就有解密,解密就是把密文进行一系列的变换,生成明文.

在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥.

加密解密到如今已经发展成了一个独立的学科 : 密码学

在密码学中,加密和解密,有两种方式 : 

1.对称加密 : 加密和解密,使用同一个密钥.

      明文 + key(密钥) => 密文

      密文 + key(密钥) => 明文

2.非对称加密 : 有两个密钥, 这两个密钥,一个称为"公钥",一个称为"私钥".(公钥就是公开的,私钥就是自己藏好的)

      明文 + 公钥 => 密文                      密文 + 私钥 => 明文

     明文 + 私钥 => 密文                       密文 + 公钥 => 明文

用一个钥匙加密就用一个钥匙解密

二.HTTPS的工作过程

1.先引入对称加密

    对称加密其实就是通过同一个"密钥",把明文加密成密文,并且也能把密文解密称明文.

引入对称加密之后,即使数据被截获,由于黑客不知道密钥是啥,因此就无法进行解密,也就不知道请求的真实内容是啥了.

但是事情没这么简单,服务器同一时刻其实是给很多客户端提供服务,这么多客户端,每个人用的密钥都是必须不同的(如果是相同的那密钥就太容易扩散了,黑客就也能拿到了).因此,服务器就需要维护每个客户端和每个密钥之间的关系,这也是个很麻烦的事情.

比较理想的做法,就是能在客户端和服务器之间建立连接的时候,双方协商确定这次的密钥是啥

但是如果直接把密钥明文传输,那么黑客也能获取到密钥了,所以后面的加密操作就形同虚设了.

因此密钥的传输也必须加密传输.

但是想要对密钥进行对称加密,就仍然需要先协商确定一个"密钥的密钥",这样就成了"先有鸡还是先有蛋"的问题了,此时密钥的传输再用对称加密就行不通了.

如此就需要引入非对称加密.

2.引入非对称加密

非对称加密要用到两个缪要,一个叫做"公钥",一个叫做"私钥".

公钥和私钥是配对的.最大的缺点就是运算速度非常慢,比对称加密要慢的多.

       通过公钥对明文加密,变成密文.

       通过私钥对密文解密,变成密文.

也可以反着用

       通过私钥对明文加密,变成密文.

       通过公钥对密文解密,变成明文.

  • 客户端在本地生成对称密钥,通过公钥加密,发送给服务器.
  • 由于中间的网络设备没有私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥
  • 服务器通过私钥解密,还原出客户端发送的对称密钥.并且使用这个对称密钥解密给客户端返回的响应数据.
  • 后续客户端和服务器的通信都只用对称加密即可.由于该密钥只有客户端和服务器两个主机知道,其他主机/设备不知道密钥即使截获数据也没有意义

由于对称加密的效率比非对称加密给很多,因此只是在开始阶段协商密钥的时候使用非对称加密,后续的传输仍然使用对称加密.

那么接下来问题又来了:

1.客户端如何获取到公钥?

2.客户端如何确定这个公钥不是黑客伪造的?

中间人攻击

黑客可以使用中间人攻击,获取到密钥

1.服务器具有非对称加密算法的公钥S,私钥S'

2.中间人具有非对称加密算法的公钥M,私钥M'

3.客户端向服务器发起请求,服务器明文传送公钥S给客户端

4.中间人劫持数据报文,提取公钥S并保存好,然后被劫持报文中的公钥S替换成为自己的公钥M,并将伪造报文发给客户端

5.客户端收到报文,提取公钥M(自己当然不知道公钥被更换过了),自己形成对称密钥X,用公钥M加密X,形成报文发送给服务器.

6.中间人劫持后,直接用自己的私钥M'进行解密,得到通信密钥X,在用曾经保存的服务端公钥S加密后,将报文推送给服务器.

7.服务器拿到报文,用自己的私钥S'解密,得到通信密钥X

8.双方开始采用X进行对称加密,进行通信.但是一切都在中间人的掌握中,劫持数据,进行窃听甚至修改,都是可以的.

      3.引入证书

服务端在使用HTTPS前,需要向CA机构申领一份数字证书,数字证书里含有证书申请者信息,公钥信息等,服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如省份证,证明服务端公钥的权威性.

这个证书可以理解成是一个结构化的字符串,里面包含了以下信息:

  • 证书发布机构
  • 证书有效期
  • 公钥
  • 证书所有者
  • 签名
  • ...

理解数据签名

当服务端申请CA证书的时候,CA机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如下:

1.CA机构拥有非对称加密的私钥A和公钥A'

2.CA机构对服务端申请的证书明文数据进行hash,形成数据摘要

3.然后对数据摘要要用CA私钥A'加密,得到数字签名S

服务端申请的证书明文和数字签名S共同组成了数字证书,这样一份数字证书就可以颁发给服务端了

通过证书解决中间人攻击

在客户端和服务器刚建立连接的时候,服务器给客户端返回一个证书.

这个证书包含了刚才的公钥,也包含了网站的身份信息.

当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的).

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

完整流程

总结

HTTPS工作过程中涉及到的密钥有三组

第一组(非对称加密) : 用于校验证书是否被篡改.服务器持有私钥(私钥在注册证书的时候是获取),客户端持有公钥(操作系统包含了课信任的CA认证机构有哪些,同时持有对应的公钥),服务器使用这个私钥对证书的签名进行加密,客户端通过这个公钥解密获取到证书的签名,从而校验证书内容是否是篡改过

第二组(非对称加密) : 用于协商生成对称加密的密钥,服务器生成这组 私钥-公钥 对,然后通过证书把公钥传递给客户端.然后客户端用这个公钥给生成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密的密钥.

第三组(对称加密) : 客户端和服务器后续传输的数据都通过这个对称密钥加密解密.

其实一切关键都是围绕这个对称加密的密钥,其他的机制都是辅助这个密钥工作的: 

 第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器

 第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥

相关文章:

HTTPS加密

一.加密是什么 加密就是把明文(要传输的信息)进行一系列的变换,生成密文. 有加密就有解密,解密就是把密文进行一系列的变换,生成明文. 在这个加密和解密过程中,往往需要一个或多个中间数据,辅助进行这个过程,这样的数据称为密钥. 加密解密到如今已经发展成了一个独立的学科 : 密…...

搭建大型分布式服务(三十八)SpringBoot 整合多个kafka数据源-支持protobuf

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…...

SpringBoot如何使用日志Logback,及日志等级详解

Spring Boot默认已经集成了SLF4J&#xff08;Simple Logging Facade for Java&#xff09;作为日志的接口&#xff0c;以及Logback作为日志的实现。这意味着在大多数情况下&#xff0c;你无需做额外的配置即可开始记录日志。 下面是一个简要的指南&#xff0c;包括如何在Spring…...

若依启动run-modules-system.bat报错问题解决方案

在启动run-modules-system.bat时遇到了一些问题,在网上搜索无果后,排查解决完毕 1.启动nacos时,报错如下 Error creating bean with name grpcClusterServer: Invocation of init method failed; nested exception is java.io.IOException: Failed to bind to address 0.0.0.0…...

Aws CodeCommit代码仓储库

1 创建IAM用户 IAM创建admin用户&#xff0c;增加AWSCodeCommitFullAccess权限 2 创建存储库 CodePipeline -> CodeCommit -> 存储库 创建存储库 3 SSH 1) window环境 3.1.1 上载SSH公有秘钥 生成SSH秘钥ID 3.1.2 编辑本地 ~/.ssh 目录中名为“config”的 SSH 配置文…...

PostgreSQL的内存参数

PostgreSQL的内存参数 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777PostgreSQL 提供了多种内存参数&#x…...

【教程】在CentOS上使用Docker部署前后端分离项目的完整指南

当在CentOS上使用Docker部署前后端分离项目时,需要遵循一系列步骤来实现这一目标。以下是每个步骤的详细内容: 步骤1:安装Docker和Docker Compose 1.1 安装Docker 在CentOS上安装Docker,可以按照以下步骤进行: sudo yum install -y yum-utils device-mapper-persistent…...

某公司新招了个牛逼的架构师后.....

网友评论&#xff1a; 架构师一个响指之后。第二天&#xff0c;老板不见了走走停停 回头已是数月图片是我的故事没错了&#xff0c;本来我们组有10个人&#xff0c;我把代码重构之后&#xff0c;只要半个人维护&#xff0c;于是老板要裁掉9个>人&#xff0c;于是我被搞走了图…...

云计算和雾计算

雾计算作为传统集中式数据存储系统&#xff08;云&#xff09;和边缘设备之间的中间层。雾扩展了云&#xff0c;使计算和数据存储更接近边缘。雾由多个节点&#xff08;雾节点&#xff09;组成&#xff0c;并创建一个本地网络&#xff0c;使其成为一个去中心化的生态系统——雾…...

正缘画像 api数据接口

测测正缘画像&#xff0c;相貌特征&#xff0c;高矮胖瘦&#xff0c;黑白美丑&#xff0c;对方何许人也&#xff0c;远嫁近娶&#xff0c;何方定居&#xff0c;家庭观&#xff0c;持家爱家&#xff0c;生活质量&#xff0c;富裕贫穷&#xff0c;健康情况&#xff0c;测算结果仅…...

Java 基础面试300题 (171- 200)

Java 基础面试300题 &#xff08;171- 200&#xff09; 171.什么是同步&#xff1f; 当多个线程试图同时访问共享资源时&#xff0c;那么他们需要以某种方式让资源一次只能由一个线程访问。实现这一目标的过程被称为同步。Java提供了一个名为synchronized的关键字实现这一目标…...

0基础学习Elasticsearch-使用Java操作ES

文章目录 1 背景2 前言3 Java如何操作ES3.1 引入依赖3.2 依赖介绍3.3 隐藏依赖3.4 初始化客户端&#xff08;获取ES连接&#xff09;3.5 发送请求给ES 1 背景 上篇学习了0基础学习Elasticsearch-Quick start&#xff0c;随后本篇研究如何使用Java操作ES 2 前言 建议通篇阅读再回…...

【Linux】GNU编译器基础

文章目录 GCCMakefile、make GCC 常见的GNU编译器是GCC其包含gcc以及g等&#xff0c;适用于C/C中&#xff0c;在Windows系统中通常使用IDE进行程序的编写和编译、链接等操作&#xff0c;但在Linux系统中通常使用GNU编译器来进行&#xff0c;对于C/C等高级语言需要进行预编译、编…...

Linux 软件安装:从源码编译到包管理器安装

Linux 软件安装&#xff1a;从源码编译到包管理器安装 在 Linux 操作系统中&#xff0c;软件安装是一个非常重要的任务。不同的软件安装方式有不同的优缺点&#xff0c;本篇博客将介绍 Linux 软件安装的几种方式&#xff0c;包括从源码编译安装、使用包管理器安装和使用第三方…...

Python3 match-case 语句

前言 本文主要介绍match-case语句与switch-case的区别&#xff0c;及match-case语句的基本用法。 文章目录 前言一、switch-case 和match-case的区别二、match-case的基本用法1、可匹配的数据类型2、多条件匹配3、通配符匹配 一、switch-case 和match-case的区别 C语言里面s…...

图论第三天

似乎要团建了&#xff0c;我再猫会。我必须参与上团建再走。 130.被围绕的区域 先把外围的O变成A&#xff0c;再把飞地的O变成X&#xff0c;再把外围A变回O class Solution { public:int neighbor[4][2] {1,0,0,-1,-1,0,0,1};void solve(vector<vector<char>>&a…...

计算机网络学习2

文章目录 信道复用技术 第三章数据链路层概述数据链路层的三个重要问题封装成帧和透明传输差错检测可靠传输的相关基本概念可靠传输的实现机制停止等待协议回退N帧协议选择重传协议 点对点协议PPP共享式以太网网络适配器和MAC地址CSMA_CD协议的基本原理共享式以太网的争用期共享…...

unittest框架

目录 框架&#xff1a; unittest框架: 使用的原因: 核心要素(组成): TestCase测试用例: 可能出现的错误&#xff1a; TestSuite(测试套件): TestRunner(测试执行): 整体步骤: 查看执行结果: TestLoader测试加载: 方法级别Fixture: 类级别Fixture: 模块级别Fixture: 用例脚本…...

Python中的__str__和__repr__:揭示字符串表示的奥秘

标题&#xff1a;Python中的__str__和__repr__&#xff1a;揭示字符串表示的奥秘 摘要 在Python中&#xff0c;对象的字符串表示对于调试和日志记录至关重要。__str__和__repr__是两个特殊的方法&#xff0c;用于定义对象的字符串表示形式。尽管它们在功能上相似&#xff0c;…...

gazebo插入一个图片

在下面的目录下添加文件夹 my_ground_plane 文件夹内容如下 model.sdf <?xml version"1.0" encoding"UTF-8"?> <sdf version"1.4"><model name"my_ground_plane"><static>true</static><link na…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中&#xff0c;高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司&#xff0c;近期做出了一个重大技术决策&#xff1a;弃用长期使用的 Nginx&#xff0c;转而采用其内部开发…...

06 Deep learning神经网络编程基础 激活函数 --吴恩达

深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

对象回调初步研究

_OBJECT_TYPE结构分析 在介绍什么是对象回调前&#xff0c;首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例&#xff0c;用_OBJECT_TYPE这个结构来解析它&#xff0c;0x80处就是今天要介绍的回调链表&#xff0c;但是先不着急&#xff0c;先把目光…...