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://www.mzph.cn/news/902121.shtml

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

相关文章

ORACLE数据库转国产阿里OceanBase数据库

1.BLOB类型修改 将接口内oracle.sql.BLOB改为java.sql.Blob 2.REGEXP_LIKE 判断函数正则表达式中字符转义问题 OB的正则表达式使用的是标准的Linux模式,oracle是黑盒子,在处理部分转义符([])的时候, Oracle无需使用转义符,OB务必使用转义符,加/转义处理,例如在regexp_like(t…

STM32的三种启动方式

目录 一、从主闪存存储器启动(Main Flash Memory) 二、从系统存储器启动(System Memory) 三、从内置SRAM启动(Embedded SRAM) 一、从主闪存存储器启动(Main Flash Memory) >&g…

Flutter使用flutter_driver进行自动化测试

Flutter自动化测试实践指南 作为一名iOS开发者,我最近对Flutter的自动化测试产生了浓厚兴趣。在开发过程中,我发现自动化测试对于保证应用质量至关重要,特别是像我们这样的创业团队,测试资源有限的情况下。 搭建Flutter自动化测…

Halcon应用:九点标定-手眼标定

提示:若没有查找的算子,可以评论区留言,会尽快更新 Halcon应用:九点标定-手眼标定 前言一、Halcon应用?二、应用实战1、图形理解[eye-to-hand]:1.1、开始应用2、 图形理解[eye-in-hand]2.1、 开始应用 前言…

【C++11】列表初始化、右值引用、完美转发、lambda表达式

📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🌐 C 语言 上篇文章:unordered_map、unordered_set底层编写 下篇文章:C11:新的类功能、模板的可…

Pandas取代Excel?

有人在知乎上提问:为什么大公司不用pandas取代excel? 而且列出了几个理由:Pandas功能比Excel强大,运行速度更快,Excel除了简单和可视化界面外,没有其他更多的优势。 有个可怕的现实是,对比Exce…

Vue 3 中将 ref 创建的响应式对象数据转换为普通(非响应式)的数据

Vue 3 中使用 ref 创建的响应式对象数据转换为普通(非响应式)的数据,有以下几种方法: 1. 访问 .value 属性: 这是最直接、最常见的方法。 由于 ref 对象的值存储在其 .value 属性中,直接访问该属性即可获得普通数据。…

四月下旬系列

CUHKSZ 校赛 期中考试 DAY -1。 省流&#xff1a;前 1h 切 6 题&#xff0c;后 3h 过 1 题&#xff0c;读错一个本来很【】的题&#xff0c;被大模拟构造创【】了。 本地除了 VSCode 没有 Extensions&#xff0c;别的和省选差不多。使用 DEVC。 前 6 题难度 < 绿&#x…

下采样(Downsampling)

目录 1. 下采样的定义与作用​​ ​​2. 常见下采样方法​​ ​​(1) 池化&#xff08;Pooling&#xff09;​​ ​​(2) 跨步卷积&#xff08;Strided Convolution&#xff09;​​ ​​(3) 空间金字塔池化&#xff08;SPP&#xff09;​​ ​​3. PyTorch 实现示例​​ …

lottie深入玩法

A、json文件和图片资源分开 delete 是json资源名字 /res/lottie/delete_anim_images是图片资源文件夹路径 JSON 中引用的图片名&#xff0c;必须与实际图片文件名一致 B、json文件和图片资源分开&#xff0c;并且图片加载不固定 比如我有7张图片&#xff0c;分别命名1~7&…

高精度算法(加、减、乘、除、阶乘和)​

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 唯有主动付出&#xff0c;才有丰富的果…

探索大语言模型(LLM):马尔可夫链——从诗歌分析到人工智能的数学工具

提出背景与灵感起源 马尔可夫链由俄国数学家安德雷马尔可夫于1906年提出&#xff0c;最初是为了挑战当时概率论中“独立性假设”的局限性。他希望通过研究相依变量序列&#xff0c;证明即使随机变量之间存在依赖关系&#xff0c;大数定律和中心极限定理仍然成立。 灵感来源&am…

【web服务_负载均衡Nginx】三、Nginx 实践应用与高级配置技巧

一、Nginx 在 Web 服务器场景中的深度应用​ 1.1 静态网站部署与优化​ 在 CentOS 7 系统中&#xff0c;使用 Nginx 部署静态网站是最基础也最常见的应用场景。首先&#xff0c;准备网站文件&#xff0c;在/var/www/html目录下创建index.html文件&#xff1a; sudo mkdir -p…

C语言格式化输入输出总结 (printf和scanf)

一、printf格式化输出 1. 整数格式化 (%d, %i, %u, %o, %x) c复制代码 int num 42; // 以下为不同格式输出示例 printf("%d", num); // 42 (十进制) printf("%i", num); // 42 (同%d) printf("%u", num); // 42 (无符号十进制…

哈夫曼编码和哈夫曼树

哈夫曼编码&#xff08;Huffman Coding&#xff09; 是一种基于字符出现频率的无损数据压缩算法&#xff0c;通过构建哈夫曼树&#xff08;Huffman Tree&#xff09; 来生成最优前缀编码&#xff0c;使得高频字符用短编码&#xff0c;低频字符用长编码&#xff0c;从而实现高效…

Jetson Orin NX 部署YOLOv12笔记

步骤一.创建虚拟环境 conda create -n yolov12 python3.8.20 注意&#xff1a;YOLOv12/YOLOv11/YOLOv10/YOLOv9/YOLOv8/YOLOv7a/YOLOv5 环境通用 步骤二.激活虚拟环境 conda activate yolov12 #激活环境 步骤三.查询Jetpack出厂版本 Jetson系列平台各型号支持的最高Jetp…

Linux指令篇 (2)

指令篇&#xff08;2&#xff09; Linux基本指令&#xff08;2&#xff09;(1) mkdir指令&#xff08;重要&#xff09;&#xff08;2&#xff09;rmdir指令&&rm指令(重要)&#xff08;3&#xff09;man指令(重要)&#xff08;4&#xff09;cp指令&#xff08;重要&…

致远OA——自定义开发rest接口

文章目录 :apple: 业务流程 &#x1f34e; 业务流程 代码案例&#xff1a; https://pan.quark.cn/s/57fa808c823f 官方文档&#xff1a; https://open.seeyoncloud.com/seeyonapi/781/https://open.seeyoncloud.com/v5devCTP/39/783.html 登录系统 —— 后台管理 —— 切换系…

区块链如何成为智能城市的底层引擎?从数据透明到自动化治理

区块链如何成为智能城市的底层引擎&#xff1f;从数据透明到自动化治理 引言&#xff1a;智能城市真的智能吗&#xff1f; 在数字化时代&#xff0c;智能城市&#xff08;Smart City&#xff09;逐步成为各国推动城市创新的重要方向。城市管理者希望借助物联网&#xff08;IoT…

洛谷P1177【模板】排序:十种排序算法全解(1)

扯谈 之前我已经把十大排序算法全讲了一遍&#xff08;具体详见专栏C排序算法&#xff09;,今天我们来用一道简单的题目总结实战一下。 算法实现 一、桶排序&#xff08;Bucket Sort&#xff09; ‌适用场景‌&#xff1a;数据范围已知且较小&#xff08;需根据测试数据调整…