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

HTTP HTTPS RSA

推荐阅读 小林coding HTTP篇

文章目录

  • HTTP 80
    • HTTP 响应码
        • 1xx:信息性状态码(Informational)
        • 2xx:成功状态码(Success)
        • 3xx:重定向状态码(Redirection)
        • 4xx:客户端错误(Client Error)
        • 5xx:服务器错误(Server Error)
      • 常见字段
      • GET POST
      • HTTP/1 /2 /3
        • HTTP/1.0
        • HTTP/1.1
        • HTTP/2
        • HTTP/3 【QUIC】
  • HTTPS 443
      • 加密方式
        • 混合加密
        • 摘要算法 -> 数字签名
        • 数字证书
      • TLS 1.2 握手
      • RSA 算法加密
        • 过程:
        • 原理:
        • 为什么安全:

HTTP 80

超文本传输协议 HyperText Transfer Protocol

HTTP 响应码

1xx:信息性状态码(Informational)

表示请求已被接收,继续处理。

  • 100 Continue:客户端应继续其请求。

  • 101 Switching Protocols:服务器同意切换协议。

2xx:成功状态码(Success)

表示请求已成功被接收、理解并处理。

  • 200 OK:请求成功。
  • 201 Created:资源已成功创建,常用于 POST 请求。
  • 204 No Content:请求成功,但无返回内容。
3xx:重定向状态码(Redirection)

客户端需要进一步操作才能完成请求。

  • 301 Moved Permanently:永久重定向。
  • 302 Found(或 Temporary Redirect):临时重定向。
  • 304 Not Modified:资源未修改,可使用缓存。
4xx:客户端错误(Client Error)

请求包含错误,客户端需修改。

  • 400 Bad Request:请求无效,服务器无法理解。
  • 401 Unauthorized:未授权,需要认证。
  • 403 Forbidden:禁止访问,即使认证也无权。
  • 404 Not Found:资源不存在。
  • 405 Method Not Allowed:请求方法不被允许。
5xx:服务器错误(Server Error)

服务器在处理请求时出错。

  • 500 Internal Server Error:服务器内部错误。
  • 502 Bad Gateway:网关或代理收到无效响应。
  • 503 Service Unavailable:服务器暂时不可用(如超载或维护)。
  • 504 Gateway Timeout:网关超时未收到上游服务器响应。

常见字段

  • Host: www.xxx.com 请求中指定对方域名

  • Content-Length: 1000 回应数据长度

  • Connection: Keep-Alive 长连接

  • Content-Type: text/heml; charset=utf-8 数据格式
    (请求方可以指定格式: Accept: /

  • Content-Encoding: gzip 编码,即压缩方法
    (Accept-Encoding: gzip, deflate)

GET POST

  • GET 的语义是从服务器获取指定的资源
    安全且幂等,因为是只读,服务器数据是安全的,每次请求结果是相同的。

  • POST 的语义是根据请求负荷(报文body)对指定的资源做出处理
    不幂等,会修改资源。

HTTP/1 /2 /3

在这里插入图片描述

HTTP/1.0

每个请求都要新建一个TCP连接(三次握手),而且是串行请求 —— 发出A请求,并且收到回复后,四次挥手。接着三次握手开始发送B请求 … 【请求的队头阻塞】

HTTP/1.1

使用长连接的通信方式。

进而支持进行管道(pipeline)网络传输 —— 即 A 请求发送后,就可以发出B请求了。不过A请求的响应处理完之后才能处理B请求的响应。 【响应的队头阻塞】

其他缺点:
请求头部没有压缩,每次交互都会发送完整头部,而且是纯文本形式。
没有请求优先级控制。
请求只能从客户端开始,服务器只能被动响应。

HTTP/2
  • 头部压缩
    如果你同时发出多个请求,他们的头是一样的或是相似的,那么协议会帮你消除重复的部分。
    HPACK 算法压缩:在客⼾端和服务器同时维护⼀张头信息表,所有字段都会存⼊这个表,⽣成⼀个索引号,以后就不发送同样字段了,只发送索引号,这样就提⾼速度了。

  • 二进制格式
    全面采用了二进制格式,头信息和数据体都是二进制,并且统称为帧(frame):头信息帧(Headers Frame)和数据帧(Data Frame)。
    如状态码200:由 ‘2’‘0’‘0’ 三个字符 -> HPACK 的静态表编码是 8,1个字节 10001000

  • 并发传输
    引出了 Stream 概念,多个 Stream 复用在一条 TCP 连接。
    在这里插入图片描述
    针对不同的 HTTP 请求用独一无二的 Stream ID 来区分,接收端可以通过 Stream ID 有序组装成 HTTP 消息,不同 Stream 的帧是可以乱序发送的 。
    即可以并行交错地发送请求和响应。
    在这里插入图片描述

  • 服务器主动推送资源
    客户端和服务器双方都可以建立 Stream,客户端建立的 Stream 必须是奇数号,而服务器建立的 Stream 必须是偶数号。
    在这里插入图片描述
    比如获取HTML文件后,还需要依赖的CSS来渲染,这时就不需要再次发送请求了,而是服务器主动推送相关资源。

不过,
因为是基于 TCP 协议传输数据,TCP层保证了收到的字节流数据是完整且连续的才会返回给应用层
—— 那么当「前 1 个字节数据」没有到达时,后收到的字节数据只能存放在内核缓冲区里等待 【HTTP/2 队头阻塞问题】
在这里插入图片描述
而且一旦发生丢包现象,就会触发TCP重传机制,连接中所有的HTTP请求仍然得接着等待

实际上 HTTP/2 的效率并不比 HTTP/1.1 快很多,对于多个数据流,HTTP/1.1 通过建立多个 TCP 连接的方式也能处理。

HTTP/3 【QUIC】

基于 UDP 的 QUIC 协议

  • 无队头阻塞
    QUIC 自己的机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响,因此不存在队头阻塞问题。
    在这里插入图片描述

  • 更快的连接建立
    对于 HTTP/1 和 HTTP/2 协议,TCP 和 TLS 是分层的,分别属于内核实现的传输层、openssl 库实现的表示层,因此它们难以合并在一起,需要分批次来握手,先 TCP 握手,再 TLS 握手。
    QUIC 协议握手会在QUIC帧内包含 TLS/1.3,只需要 1 RTT 就可以「同时」完成建立连接与密钥协商。
    甚至,在第二次连接的时候(如会话恢复),应用数据包可以和 QUIC 握手信息一起发送,达到 0-RTT 的效果。
    在这里插入图片描述

  • 连接迁移
    QUIC 协议通过连接 ID 来标记通信的两个端点。
    即使设备网络变化,IP地址等变了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本,没有丝毫卡顿感,达到了连接迁移的功能。

基于 TCP 传输协议的 HTTP 协议,由于是通过四元组(源 IP、源端口、目的 IP、目的端口)确定一条 TCP 连接。
那么当移动设备的网络从 4G 切换到 WIFI 时,意味着 IP 地址变化了,那么就必须要断开连接,然后重新建立连接。而建立连接的过程包含 TCP 三次握手和 TLS 四次握手的时延,以及 TCP 慢启动的减速过程,给用户的感觉就是网络突然卡顿了一下,因此连接的迁移成本是很高的。

HTTPS 443

HTTP 是明文传输,不安全。

HTTPS 在 HTTP层与TCP层之间添加了TLS协议(传输层安全性协议 Transport Layer Security)
TCP三次握手后还要进行 TLS 握手

SSL :安全套接层 Secure Sockets Layer

HTTPS 一定安全可靠

加密方式

以下几个结合,分别确保 消息加密,消息不被篡改,中间人无法伪造

混合加密
  • 在通信建立前采用非对称加密的方式交换「会话秘钥」
    RSA 算法 (非对称加密算法)

  • 在通信过程中全部使用对称加密的「会话秘钥」

摘要算法 -> 数字签名

用摘要算法(哈希函数)来计算出内容的哈希值

对方也对内容计算,比较两个哈希值。

通过「私钥加密,公钥解密」的方式,保证消息不会被冒充

(但是公钥仍可能是中间人冒充的 —— 中间人攻击 !)

在这里插入图片描述

数字证书

Certificate Authority 证书授权
在这里插入图片描述

浏览器内置证书!里面有公钥

客户端验证流程:

在这里插入图片描述

证书信任链的问题:

如百度证书,可能证书是中间证书签发的
在这里插入图片描述
不是根证书,就无法根据本地已有的根证书中的公钥去验证 证书是否可信,于是向 CA 请求该中间证书,直到根证书。

电脑系统内置的根证书:

在这里插入图片描述

TLS 1.2 握手

基于 RSA 算法的 TLS 握手过程(TLS 1.2 with RSA key exchange):

  1. ClientHello
    客户端发起加密通信请求 【支持的TLS协议版本;加密用随机数;支持的加密算法】
  2. SeverHello
    服务器回应客户端 【确认TLS版本;加密用随机数;确认使用的加密算法;服务器证书】
  3. 客户端回应
    客户端先通过浏览器或操作系统内置的 CA 公钥,确认服务器的数字证书的真实性。
    如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文。
    接着发送【 预主密钥 ;加密通信算法改变通知;客户端握手结束通知】,同时自己用前面两个随机数+预主密钥生成了本次通信用的公钥——会话密钥。
  4. 服务器的最后回应
    服务器也通过同样的方式计算出会话密钥
    也向客户端发送最后的信息:【加密通信算法改变通知;服务器握手结束通知】

之后通过 会话密钥 加密 HTTP 通信即可。

RSA 握手“不那么安全”
一旦服务器私钥泄露,历史通信就可以被解密(前向保密性差)
现在主流推荐使用的是 TLS 1.3 ECDHE(椭圆曲线 Diffie-Hellman Ephemeral),支持前向保密。

RSA 算法加密

在这里插入图片描述

需要先了解一些数论:

  • 欧拉函数 φ ( n ) φ(n) φ(n) 表示小于等于 n 且与 n互质的正整数的个数。对质数而言就是 n-1
  • 欧拉定理:对于任意两个互质的正整数 a, n , 有 a φ ( n ) ≡ 1 ( m o d n ) a^{φ(n)} ≡1\pmod n aφ(n)1(modn)
    (≡ 是模意义下同余)
  • 费马小定理: 如果 p 是一个质数,a是一个整数且 a 与 p 互质,那么 a p − 1 ≡ 1 ( m o d p ) a^{p − 1} ≡ 1 \pmod p ap11(modp)
过程:
  1. 选择两个大质数 p , q p, q p,q
    模数 n = p ∗ q n = p*q n=pq 作为我们的模数

  2. n 的欧拉函数 φ ( n ) = ( p − 1 ) ( q − 1 ) φ (n) = (p-1)(q-1) φ(n)=(p1)(q1)

  3. 加密指数 e e e ,取数 e 与 φ (n) 互质
    e 模逆元设为 d d d ,即 e d ≡ 1 ( m o d φ ( n ) ) ed ≡ 1 \pmod {φ(n)} ed1(modφ(n)) (逆元其实就是倒数,取模意义下的)
    可得 ed 其实就是 k ∗ φ ( n ) + 1 k*φ(n) + 1 kφ(n)+1

  • 加密明文 m :
    密文 c = m e m o d n c = m^e \mod n c=memodn

    可以看到就是对原数据求幂

  • 解密:
    m = c d m o d n m = c^d \mod n m=cdmodn

原理:

整个过程就是先求明文 m 的 e 次幂,然后求 m^e 的 d 次幂

( m e ) d ( m o d n ) ({m^{e}})^{d} \pmod n (me)d(modn)


m e d ( m o d n ) {m^{ed}} \pmod n med(modn)

而由上可知 ed = k*φ(n) + 1 ,以及 欧拉定理中 m^φ(n) 取模n后为 1

所以上述表达式最终取模后为 m 本身 ✅

为什么安全:

模数 n 是公开的, e 是加密指数可作为公钥。

但是推出解密指数,需要得出 φ (n) ,这需要选择出正确的质数 p, q 。

大整数分解难题” 将一个大整数 n 分解成两个质数 p 和 q 是非常困难的

当 n 是一个 2048 位的大整数时,它的两个因数 p 和 q 也是大质数(每个约 1024 位),在现有技术和算法下,分解这样的大整数需要数十亿年

相关文章:

HTTP HTTPS RSA

推荐阅读 小林coding HTTP篇 文章目录 HTTP 80HTTP 响应码1xx:信息性状态码(Informational)2xx:成功状态码(Success)3xx:重定向状态码(Redirection)4xx:客户端…...

【深度学习与大模型基础】第10章-期望、方差和协方差

一、期望 ——————————————————————————————————————————— 1. 期望是什么? 期望(Expectation)可以理解为“长期的平均值”。比如: 掷骰子:一个6面骰子的点数是1~6&#x…...

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端,用于管理 Elasticsearch 集群中的数据,完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色: 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…...

危化品经营单位安全生产管理人员备考要点

危化品经营单位安全生产管理人员备考要点 📌 考试核心内容 ✅ 必考法规: 《危险化学品安全管理条例》重点条款(如经营许可条件) GB 18218-2018《重大危险源辨识》新标准 安全生产法律责任(罚款金额/刑事责任&…...

【python】OpenCV—Tracking(10.6)—People Counting

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考来自 更多有趣的代码示例,可参考【Programming】 1、功能描述 借助 opencv-python,用 SSD 人形检测模型和质心跟踪方法实现对人群的计数 基于质心的跟踪可以参考 【pyt…...

使用KeilAssistant代替keil的UI界面

目录 一、keil Assistant的优势和缺点 二、使用方法 (1)配置keil的路径 (2)导入并使用工程 (3)默认使用keil自带的ARM编译器而非GUN工具链 一、keil Assistant的优势和缺点 在日常学…...

FreeRTOS菜鸟入门(五)·空闲任务与阻塞延时的实现

目录 1. 实现空闲任务 1.1 定义空闲任务的栈 1.2 定义空闲任务的任务控制块 1.3 创建空闲任务 2. 实现阻塞延时 2.1 vTaskDelay()函数 2.2 修改 vTaskSwitchContext()函数 3. SysTick 中断服务函数 4. SysTick 初始化函数 通过之前我们了解知道,任…...

Doris部署生产集群最低要求的部署方案

Doris生产集群最低部署方案(2025年4月版) 一、节点规划与数量 1. FE节点(Frontend) 数量:至少 3个节点(1个Follower 2个 Observer),确保高可用(HA)。角色分…...

JBOSS反序列化漏洞解析与防范策略CVE-2017-12149

JBOSS反序列化漏洞解析与防范策略 引言 JBOSS是一个流行的开源应用服务器,广泛应用于企业级应用程序的开发和部署。然而,由于其广泛的使用和复杂的架构,JBOSS也成为了黑客攻击的常见目标。近年来,多个JBOSS漏洞被曝光&#xff0…...

MySQL MVCC工作流程详解

MySQL MVCC工作流程详解 1. 基础概念 MVCC(多版本并发控制)是通过在每行记录后面保存多个版本来实现并发控制的技术,主要用于提供并发事务访问数据库时的读一致性。 2. 核心要素 2.1 事务ID(DB_TRX_ID) 每个事务都…...

Web3技术下数字资产数据保护的实践探索

在这个信息爆炸的时代,数字资产已经成为我们生活中不可或缺的一部分。随着Web3技术的兴起,它以其去中心化、透明性和安全性的特点,为数字资产的管理和保护提供了新的解决方案。本文将探讨Web3技术在数字资产数据保护方面的实践探索&#xff0…...

从PPT到PNG:Python实现的高效PPT转图工具

从PPT到PNG:Python实现的高效PPT转图工具 在日常工作中,PPT(PowerPoint)文件是我们常用的演示工具。然而,有时候我们需要将PPT的内容提取为图片格式(如PNG)以便于展示或保存。手动将每一页PPT保…...

使用 Java 8 Stream实现List重复数据判断

import java.util.*; import java.util.stream.Collectors;public class DeduplicateStreamExample {static class ArchiveItem {// 字段定义与Getter/Setter省略(需根据实际补充)private String mATNR;private String lIFNR;private String suppSpecMod…...

状态模式详解与真实场景案例(Java实现)

模式定义 状态模式(State Pattern) 允许对象在其内部状态改变时改变它的行为,使对象看起来像是修改了它的类。属于行为型设计模式,核心思想是将状态抽象为独立对象,不同状态下行为封装在不同状态类中。 解决的问题 …...

BitMap和RoaringBitmap:极致高效的大数据结构

目录 1、引言 2、BitMap:基础 2.1、核心原理 2.2、BitMap的优势 2.3、BitMap的局限性 3、RoaringBitmap:进化 3.1、分段策略 3.2、三种容器类型 3.2.1. ArrayContainer(数组容器) 3.2.2. BitMapContainer(位图容器) 3.2.3. RunContainer(行程容器) 3.3、行…...

【Java基础】Java集合遍历方式

前言 在Java编程中,集合(Collection)是存储和操作对象的核心工具。遍历集合是开发者最频繁的操作之一,但不同场景下选择合适的遍历方式至关重要。 一、基础遍历方式 1. 基本for循环 适用场景:仅适用于List等有序集…...

Rust-引用借用规则

目录 一、概述 二、借用规则 三、详细解释 3.1 第一条规则 3.2 第二条规则 3.3 第三条规则 四、总结 Welcome to Code Blocks blog 本篇文章主要介绍了 [Rust-引用借用规则] ❤博主广交技术好友,喜欢文章的可以关注一下❤ 一、概述 Rust为确保程序在运行时不…...

如何保障企业数据的安全?软件开发中的数据安全防护措施

引言 随着数字化转型的推进,数据已经成为企业最重要的资产之一。然而,随着数据量的增长,数据泄露、丢失和滥用的风险也不断增加。如何保障企业数据的安全,成为企业在进行软件开发时必须重点关注的问题。本文将介绍软件开发中的一些…...

Linux安装开源版MQTT Broker——EMQX服务器环境从零到一的详细搭建教程

零、EMQX各个版本的区别 EMQX各个版本的功能对比详情https://docs.emqx.com/zh/emqx/latest/getting-started/feature-comparison.html...

【软件工程大系】净室软件工程

净室软件工程(Cleanroom Software Engineering)是一种以缺陷预防(正确性验证)为核心的软件开发方法,旨在通过严格的工程规范和数学验证,在开发过程中避免缺陷的产生,而非依赖后期的测试和调试。…...

软考 系统架构设计师系列知识点之杂项集萃(49)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(48) 第76题 某文件管理系统在磁盘上建立了位视图(bitmap),记录磁盘的使用情况。若磁盘上物理块的编号依次为:0、1、2、……&#xff1b…...

Day(21)--网络编程

网络编程 在网络通信协议下,不同计算机上运行的程序,进行的数据传输 应用场景:即使通信、网友对战、金融证券等等,不管是什么场景,都是计算机和计算机之间通过网络进行的数据传输 java.net 常见的软件架构 C/S&am…...

JVM 调优不再难:AI 工具自动生成内存优化方案

在 Java 应用程序的开发与运行过程中,Java 虚拟机(JVM)的性能调优一直是一项极具挑战性的任务,尤其是内存优化方面。不合适的 JVM 内存配置可能会导致应用程序出现性能瓶颈,甚至频繁抛出内存溢出异常,影响业…...

封装Tcp Socket

封装Tcp Socket 0. 前言1. Socket.hpp2. 简单的使用介绍 0. 前言 本文中用到的Log.hpp在笔者的历史文章中都有涉及,这里就不再粘贴源码了,学习地址如下:https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…...

5.1 GitHub订阅监控系统实战:FastAPI+SQLAlchemy高效架构设计与核心源码揭秘

GitHub Sentinel Agent 分析报告功能设计与实现 关键词:订阅管理 API 设计、GitHub API 集成、SQLAlchemy ORM、JWT 认证、单元测试框架 1. 订阅管理功能架构设计 订阅管理模块采用分层架构设计,通过 FastAPI 构建 RESTful 接口,结合 SQLAlchemy ORM 实现数据持久化: #me…...

2025年推荐使用的开源大语言模型top20:核心特性、选择指标和开源优势

李升伟 编译 随着人工智能技术的持续发展,开源大型语言模型(LLMs)正变得愈发强大,使最先进的AI能力得以普及。到2025年,开源生态系统中涌现出多个关键模型,它们在各类应用场景中展现出独特优势。 大型语言…...

Linux 入门九:Linux 进程间通信

概述 进程间通信(IPC,Inter-Process Communication)是指在不同进程之间传递数据和信息的机制。Linux 提供了多种 IPC 方式,包括管道、信号、信号量、消息队列、共享内存和套接字等。 方式 一、管道(Pipe&#xff09…...

Spark-SQL核心编程实战:自定义函数与聚合函数详解

在大数据处理领域,Spark-SQL是极为重要的工具。今天和大家分享一下在Spark-SQL开发中的自定义函数和聚合函数的使用,这些都是基于实际项目开发经验的总结。 在Spark-SQL开发时,第一步是搭建开发环境。在IDEA中创建Spark-SQL子模块&#xff0c…...

[Mysql][Mybatis][Spring]配置文件未能正确给驱动赋值,.properties文件username值被替换

这是最初的.properties配置文件&#xff1a; drivercom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/qykf usernameroot password123456 在Mybatis中引入后进行赋值&#xff1a; <environments default"development"><environment id"deve…...

go 指针接收者和值接收者的区别

go 指针接收者和值接收者的区别 指针接收者和值接收者的区别主要有两点&#xff1a; Go 中函数传参是传值&#xff0c;因此指针接收者传递的是接收者的指针拷贝&#xff0c;值接收者传递的是接收者的拷贝---在方法中指针接收者的变量会被修改&#xff0c;而值接收者的成员变量…...