HTTPS的工作过程

一、HTTPS 是什么

HTTPS 也是⼀个应用层协议,是在 HTTP 协议的基础上引入了⼀个加密层.
HTTP 协议内容都是按照文本的方式明文传输的。这就导致在传输过程中出现⼀些被篡改的情况.
在互联网上, 明文传输是比较危险的事情!!!
HTTPS 就是在 HTTP 的基础上进行了加密, 进⼀步的来保证用户的信息安全。

"加密" 是什么

加密就是把 明文 (要传输的信息)进行一系列变换,生成密文。
解密就是把 密文 再进行一系列变换, 还原成 明文。
在这个加密和解密的过程中, 往往需要⼀个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为 密钥

二、HTTPS 的工作过程

既然要保证数据安全, 就需要进行 "加密".
网络传输中不再直接传输明文了,而是加密之后的 "密文".
加密的方式有很多, 但是整体可以分成两大类: 对称加密 和 非对称加密 。

1、对称加密

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

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

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

 

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

但是如果这样直接把密钥明文传输, 那么黑客也就能获得密钥了,此时后续的加密操作就形同虚设了. 因此密钥的传输也必须加密传输!
但是要想对密钥进行对称加密, 就仍然需要先协商确定⼀个 "密钥的密钥". 在客户端和服务器双方协商的过程中,黑客仍能截取到 “密钥的密钥” , 此时密钥的传输再用对称加密就行不通了,就需要引入非对称加密。

2、非对称加密

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

通过公钥对明文加密, 变成密文;通过私钥对密文解密, 变成明文,也可以反着用,

通过私钥对明文加密, 变成密文, 通过公钥对密文解密, 变成明文。
公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多.
这里引入非对称加密,主要是对 对称密钥 的传输来进行加密的。 后续的传输仍然使用对称加密

主要过程如下:

  1. 服务器生成一对非对称密钥.私钥,服务器自己持有.公钥则可以告知任何的客户端.
  2. 客户端在连上服务器之后,就需要先从服务器这边拿到公钥.(公钥本身就可以公开出去,不需要加密传输)
  3. 客户端生成 对称密钥 ,拿着公钥针对 对称密钥 进行加密.
  4. 此时就可以把加密之后的密文(对称密钥)进行传输了.由于要想解密,必须通过私钥,而私钥只有服务器自己知道,此时这样的加密的数据就可以比较安全的到达服务器了.
  5. 服务器通过私钥解密之后得到了对称密钥,接下来和客户端之间的通信就通过对称加密来完成。

那么接下来问题又来了:如果这一公钥是黑客伪造的呢?

中间人攻击

黑客可以使用中间人攻击, 获取到对称密钥。
过程如下:
  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机构申领⼀份数字证书,数字证书里含有证书申请者信息、公钥信 息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端 公钥的权威性。

 

这个 证书 可以理解成是⼀个结构化的字符串,里面包含了以下信息:
  • 证书发布机构
  • 证书有效期
  • 公钥
  • 证书所有者
  • 签名 等
需要注意的是:申请证书的时候,需要在特定平台生成,会同时生成⼀对密钥对儿,即公钥和私钥。这对密钥对儿就是用来在网络通信中进行明文加密以及数字签名的。

理解数据签名

签名的形成是基于非对称加密算法的,注意,目前暂时和https没有关系,不要和https中的公钥私钥搞 混。

 

当服务端申请CA证书的时候,CA机构会对该服务端进行审核,并专门为该网站形成数字签名,过程如 下:
  1. CA机构拥有非对称加密的私钥A和公钥A'
  2. CA机构对服务端申请的证书明文数据进行hash,形成数据摘要
  3. 然后对数据摘要用CA私钥A加密,得到数字签名S
服务端申请的证书明文和数字签名S 共同组成了数字证书 ,这样⼀份数字证书就可以颁发给服务端了。

通过证书解决中间人攻击

在客户端和服务器刚一建立连接的时候, 服务器给客户端返回⼀个 证书.
这个证书包含了服务器提供的公钥, 也包含了网站的身份信息。
 
当客户端获取到这个证书之后, 会对证书进行校验( 防止证书是伪造的 ).
  • 判定证书的有效期是否过期
  • 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构).
  • 验证证书是否被篡改: 从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数据摘要), 设为 hash1. 然后计算整个证书的 hash 值, 设为 hash2. 对比 hash1 和 hash2 是否相等. 如果相等, 则说明证书是没有被篡改过的

中间人有没有可能篡改该证书?

  • 如果中间人篡改了证书的明文,由于他没有CA机构的私钥,所以无法hash之后用私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名 。
  • 如果强行篡改,客户端收到该证书后会发现明文和签名解密后的值不⼀致,则说明证书已被篡改,证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人。

中间人整个掉包证书?

  • 因为中间人没有CA私钥,所以无法制作假的证书
  • 所以中间人只能向CA申请真证书,然后用自己申请的证书进行掉包
  • 这个确实能做到证书的整体掉包,但是别忘记,证书明文中包含了域名等服务端认证信息,如果整体掉包,客户端依旧能够识别出来。
中间人没有CA私钥,所以对任何证书都无法进行合法修改,包括自己的。

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

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

相关文章

platform设备注册驱动模块的测试

一. 简介 上一篇文章编写了 platform设备注册代码,文章地址如下: 无设备树platform驱动实验:platform设备注册代码实现-CSDN博客 本文继续无设备树platform驱动实验,本文对编译好的 设备注册程序进行测试,测试所实…

(二)丶RabbitMQ的六大核心

一丶什么是MQ Message Queue(消息队列)简称MQ,是一种应用程序对应用程序的消息通信机制。在MQ中,消息以队列形式存储,以便于异步传输,在MQ中,发布者(生产者)将消息放入队列&#xff…

LeetCode 面试经典150题 80.删除有序数组中的重复项II

题目: 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件…

百度paddleocr GPU版部署

显卡:NVIDIA GeForce RTX 4070,Nvidia驱动程序版本:537.13 Nvidia驱动程序能支持的最高cuda版本:12.2.138 Python:python3.10.11。试过python3.12,安装paddleocr失败,找不到相关模块。 飞桨版本…

Linux从0到1——Linux第一个小程序:进度条

Linux从0到1——Linux第一个小程序&#xff1a;进度条 1. 输出缓冲区2. 回车和换行的本质3. 实现进度条3.1 简单原理版本3.2 实际工程版本 1. 输出缓冲区 1. 小实验&#xff1a; 编写一个test.c文件&#xff0c;&#xff1a; #include <stdio.h> #include <unistd.h…

老电脑装什么系统流畅

对于一些老旧电脑来说&#xff0c;重装系统是提升电脑性能的最佳选择。那么&#xff0c;老电脑装什么系统流畅呢&#xff1f;推荐Windows 7系统&#xff0c;它对硬件的需求相对较低。配置较低的电脑运行Windows 7可以更好地利用系统资源&#xff0c;提高电脑的运行速度和响应能…

【学习】目标检测中的anchor

参考知乎&#xff1a;anchor 简单理解 每个网格都会有一个自己的中心&#xff0c;每个小格子都可以抽象成为在自己的中心生成了一个指定大小为16个像素的矩形框&#xff0c;在这里&#xff0c;我们把这些中心称之为”锚点“&#xff0c;把每个锚点处的框称之为”锚框“。 锚…

ZooKeeper 概述

定义和功能 ZooKeeper 是一个开源的分布式协调服务&#xff0c;由 Apache 软件基金会托管。它主要用于解决分布式应用中遇到的一些复杂问题&#xff0c;如命名服务、状态同步服务、集群管理、分布式锁和队列管理等。 核心特性 一致性: ZooKeeper 保证了客户端之间的数据一致性…

c语言实现https客户端 源码+详细注释(OpenSSL下载,visual studio编译器环境配置)

OpenSSL的下载和环境配置 请参考&#xff1a;openssl下载安装教程 步骤&#xff1a;官网下载->安装到选定目录->配置环境变量->打开命令窗口检查是否安装成功 注意&#xff1a; 打开命令窗口&#xff08;快捷键winr,在弹出窗口内输入cmd按回车&#xff09;&#xff0…

ChatGPT解决hmm...something seems to have gone wrong.

ChatGPT解决hmm…something seems to have gone wrong. 这里是官方社区的一种workaround办法。仅仅只是mark一下。 我这边遇到的现象是&#xff0c;ChatGPT 3.5是正常的&#xff0c;但是使用ChatGPT 4就会频繁的出现这样的输出。而且恶心的是&#xff0c;即使是这种输出&…

安卓性能优化面试题 11-15

11. 简述APK安装包瘦身方案 ?(1):剔 除掉冗余的代码与不必要的jar包;具体来讲的话,我们可以使用SDK集成的ProGuard混淆工具,它可以在编译时检查并删除未使用的类、字段、方法 和属性,它会遍历所有代码找到无用处的代码,所有那些不可达的代码都会在生成最终apk文件之前被…

(三)丶RabbitMQ的四种类型交换机

前言&#xff1a;四大交换机工作原理及实战应用 1.交换机的概念 交换机可以理解成具有路由表的路由程序&#xff0c;仅此而已。每个消息都有一个称为路由键&#xff08;routing key&#xff09;的属性&#xff0c;就是一个简单的字符串。最新版本的RabbitMQ有四种交换机类型&a…

java高可用系统之降级 + 熔断

服务降级&#xff1a;服务器压力太大&#xff0c;根据当前业务及流量对一些服务和页面有策略的降级&#xff0c;保证核心任务事务正常运行。 降级方式包括&#xff1a; 延迟服务&#xff1a;发表评论是重要服务&#xff0c;要保证正常运行&#xff0c;但是给用户加积分&#…

音频数据如果在中断中会随机给的那就放入队列或者缓冲区;队列缓冲区对音频的作用

回采的数据是在中断函数au0_dma_isr_data_output里面给的&#xff0c;而给算法的时候是在主程序karaok_sdadc_process&#xff0c;这样子就会出现中断给的数据和当前的mic帧不匹配&#xff0c;或者说每次的差值不一定&#xff0c;算法就会有问题&#xff0c;解决办法是讲回采数…

云计算2主从数据库

设置主从数据库的目的是将数据库1和数据库2分别建在两个虚拟机上&#xff0c;并实现数据互通访问 首先准备两个虚拟机&#xff0c;这里示例ip分别为&#xff1a; 192.168.200.10&#xff1b;192.168.200.20 修改主机名&#xff0c;一个是mysql1&#xff0c;一个是mysql2&#x…

vscode 运行 java 项目之解决“Build failed, do you want to continue”的问题

Visual Studio Code运行 java 起来似乎比 IDEA 更轻量、比 eclipse 更友好&#xff0c;是不可多得的现代编译法宝。 安装好官方推荐的 java 扩展包后&#xff0c;就可以运行 java 代码了。功能 比 code runner 强&#xff0c;支持 gradle、maven、普通java项目&#xff0c;运行…

[云原生] Prometheus之部署 Alertmanager 发送告警

一、Alertmanager 发送告警的介绍 Prometheus 对指标的收集、存储与告警能力分属于 Prometheus Server 和 AlertManager 两个独立的组件&#xff0c;前者仅负责定义告警规则生成告警通知&#xff0c; 具体的告警操作则由后者完成。 Alertmanager 负责处理由 Prometheus Serve…

力扣L12--- 125验证回文串(java版)-2024年3月15日

1.题目 2.知识点 注1&#xff1a;在 Java 中&#xff0c;toString() 方法用于将对象转换为字符串表示形式。对于数组对象&#xff0c;toString() 方法将返回数组的字符串表示形式&#xff0c;其中包含数组中每个元素的字符串表示形式&#xff0c;以逗号分隔&#xff0c;并且包…

Python基础入门 --- 1-2.字面量

文章目录 Python基础入门第一章&#xff1a;1.1 第一个python程序 第二章 &#xff1a;2.1 字面量2.2 常用的值类型2.3 字符串2.3.1 三种定义方式2.3.2 引号嵌套2.3.3 字符串拼接2.3.4 字符串格式化2.3.5 格式化的精度控制数字精度控制&#xff1a; 2.3.6 字符串格式化方式22.3…

CentOS7 部署 k8s

准备两台虚拟机192.168.152.129192.168.152.130更改主机名192.168.152.129&#xff1a;hostnamectl set-hostname k8s-masterhostnamectl192.168.152.130&#xff1a;hostnamectl set-hostname k8s-node1hostnamectl master节点配置 1.配置hosts 在两台节点上执行vim /etc/h…