应用层协议:httphttps,如何进行安全握手?

目录

  • 应用层协议
    • 序列化与反序列化
    • JSON
    • 网络版本计算器
    • URL
      • urlencode和urldecode
    • HTTP协议
      • 简单认识HTTP协议
      • HTTP协议格式
      • HTTP的一些方法
      • HTTP状态码
      • Http的特征
      • cookie
      • Connection
    • HTTPS
      • HTTPS是什么
      • 加密与解密
      • 常见的加密方式
        • 对称加密
        • 非对称加密
      • 什么是数据摘要
      • 什么是证书
      • HTTPS如何安全握手

应用层协议

序列化与反序列化

序列化:结构化数据转换为字节流数据。
反序列化:字节流转换为结构化数据。

作用:

  • 降低编写应用层代码难度,解决通信成本难题。
  • 结构化数据一般给上层业务使用。
  • 网络比较适合传输字节流式数据。

协议定制:

  • 定义请求与响应的字段需要哪些,字段本身就是协议的一部分

JSON

JSON(JavaScript对象表示法)是一种轻量级的数据交换格式,易于人们阅读和编写,也易于机器解析和生成。

它是一种完全与语言无关的文本格式,但使用了C系列语言程序员熟悉的约定,包括C、C++、C#、Java、JavaScript、Perl、Python等等。

JSON通常用于在服务器和Web应用程序之间传输数据,作为XML的替代方案。它也常用于配置文件和数据存储。JSON数据表示为键值对,其中键是字符串,值可以是字符串、数字、布尔值、数组或其他JSON对象。

image-20230720095852338

网络版本计算器

将客户端发送的结构化数据序列化为字节流式,将字节流式数据从网络传输到服务器,再在服务器端进行反序列化,将字节流式数据反序列化为结构化数据进行计算,再将计算结果序列化为字节流式数据再传输到网络中,由客户端接收。

这种,能够保证一端发送时构造的数据,在另一端能够正确进行解析的约定,就是应用层协议

URL

平时我们俗称的 “网址” ,其实就是说的 URL。

在这里插入图片描述

协议名称://server ip[:80]/a/b/c/d/e.html ->定义互联网中唯一的资源:URL,统一资源定位符

  • server ip -> 确定唯一的机器

  • [:80] -> 该服务器提供服务的进程

  • /a/b/c/d/ -> 客户要访问的资源路径

    绝对路径?并非,该资源路径是基于当前web根路径的相对路径

  • e.html -> 客户要的文件名

全球范围内所有资源,只要找到它的url就能访问该资源。基于这种方式来获取资源称为WWW(World Wide Web),万维网。

urlencode和urldecode

/ ? : 等这样的字符,已经被url当做特殊意义理解了,因此这些字符不能随意出现。

比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义,转义的规则:将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。

urldecode是urlencode的逆过程。

HTTP协议

基于请求和响应的这种模式,称之为CS模式。交互的就是双方的报文。

http协议是应用层的协议,底层采用的叫做tcp。http之前已经完成三次握手的动作。

简单认识HTTP协议

  1. 单纯在报文角度,http可以是基于行的文本协议。

http通过空行的方式区分报头和有效载荷。

  1. 一个简单的http demo

#include <iostream>
#include <memory>
#include <cassert>
#include <fstream>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "Util.hpp"

#include "HttpServer.hpp"
#include "Usage.hpp"

// 一般http都要有自己的web根目录
#define ROOT "./wwwroot"
// 如果客户端只请求了一个/, 返回默认首页
#define HOMEPAGE "index.html"

void HandlerHttpRequest(int sockfd)
{
    // 1. 读取请求 for test
    char buffer[10240];
    ssize_t s = recv(sockfd, buffer, sizeof(buffer) - 1, 0);
    if (s > 0)
    {
        buffer[s] = 0;
    }
    std::cout << buffer << "\n--------------------\n"
              << std::endl;

    std::vector<std::string> vline;
    Util::cutString(buffer, "\n", &vline);

    std::vector<std::string> vblock;
    Util::cutString(vline[0], " ", &vblock);

    std::string file = vblock[1];
    std::string target = ROOT;

    if (file == "/")
        file = "/index.html";
    target += file;
    std::cout << target << std::endl;

    std::string content;
    std::ifstream in(target);
    if (!in.is_open())
    {
    }
    else
    {
        std::string line;
        while (std::getline(in, line))
        {
            content += line;
        }
        in.close();
    }
    std::string HttpResponse;
    if (content.empty())
    {
        HttpResponse = "HTTP/1.1 301 Moved Permanently\r\n";
        HttpResponse += "Location: http://8.130.119.166:8081/a/b/404.html\r\n";
    }
    else
    {
        HttpResponse = "HTTP/1.1 200 OK\r\n";
        HttpResponse += ("Content-Type: text/html\r\n");
        HttpResponse += ("Content-Length: " + std::to_string(content.size()) + "\r\n");
        HttpResponse += "Set-Cookie: 这是一个cookie\r\n";
    }
    HttpResponse += "\r\n";
    HttpResponse += content;

    // std::cout << "########start#################" << std::endl;

    // for(auto &iter : vblock){
    //     std::cout << "---" << iter << "\n" << std::endl;
    // }
    // std::cout << "##########end###############" << std::endl;

    // 2. 试着构建一个http的响应
    send(sockfd, HttpResponse.c_str(), HttpResponse.size(), 0);
}

int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        Usage(argv[0]);
        exit(0);
    }
    std::unique_ptr<HttpServer> httpserver(new HttpServer(atoi(argv[1]), HandlerHttpRequest));
    httpserver->Start();
    return 0;
}

HTTP协议格式

请求:

首行: [方法] + [url] + [版本]

Header: 请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束。

Body: 空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度。

响应:

首行:[版本号] + [状态码] + [状态码解释]

Header:请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束

Body:空行后面的内容都是Body. Body允许为空字符串. 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中。

常见Header:
Content-Type:数据类型(text/html等)
Content-Length: Body的长度
Host:客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent:声明用户的操作系统和浏览器版本信息;
referer:当前页面是从哪个页面跳转过来的;
location:搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能;

HTTP的一些方法

表单:收集用户数据,并把用户数据推送给服务器。表单中的数据,会被转成http requst的的一部分。表单一般是需要被提交的,指明提交方法(GRET/POST)。

在这里插入图片描述

  • GET方法通过URL向服务端传参,会回显输入的私密信息,不够私密。
    在这里插入图片描述

  • POST方法通过http正文提交参数。不会回显,私密性有保证。
    在这里插入图片描述

私密 ≠ 安全,只是明文看不到。

HTTP状态码

在这里插入图片描述

最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(Bad Gateway)。

重定向:当我们进行某些网页请求时,因为功能要求请求登陆其他页面或者网站。

永久重定向(301):影响用户后续的请求策略。

临时重定向(302、307):不影响用户后续的请求策略。

Http的特征

  1. 简单快速
  2. 无连接
  3. 无状态,并不会记录用户历史或者上一次请求

什么可以用来保存记录用户信息?cookie。

cookie

  • cookie文件:保存用户信息。分为文件级cookie与内存级cookie。
  • Set-Cookie:"Set-Cookie"响应头用于服务器向客户端发送cookie。它用于在客户端设备上存储信息,可用于各种目的,如会话管理、用户跟踪和个性化。
  • cookie的存在,导致http网络存在安全风险。

Connection

  • Connection:keep-alive,长链接,可以放多个请求。
  • Connection:close,短链接,处理完成一次请求后直接关闭。

HTTPS

HTTPS是什么

image-20230720004251782

HTTP协议内容都是按照文本的方式明文传输的,这就导致在传输过程中,出现一些被篡改的情况。

HTTPS也是一个应用层协议,是HTTP协议的基础上引入了一个加密层。

加密与解密

因为http的内容是明文传输的,明文数据会经过路由器、wifi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击,所以我们才需要对信息进行加密。

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

解密就是把密文再进行一系列变换,还原成明文。

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

加密与解密到如今已经发展成一个独立的科学:密码学。密码学的奠基人,艾伦·麦席森·图灵。

常见的加密方式

对称加密

  • 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密,特征:加密和解密所用的密钥是相同的。
  • 常见对称加密算法:DES、3DES、AES、TDEA、Blowfish、RC2等
  • 特点:算法公开、计算量小、加密速度快、加密效率高

举个栗子,一个简单的对称密钥,按位异或:
在这里插入图片描述

非对称加密

  • 需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
  • 常见非对称加密算法(了解):RSA,DSA,ECDSA
  • 特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。

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

什么是数据摘要

对原始数据进行哈希散列,生成固定的散列值,这个散列值是唯一存在的,叫做该原始数据的数据摘要。

哈希散列是不可逆的,因此数据摘要不能进行解密,即数据摘要不是加密。

什么是证书

原始数据,通过哈希散列->,固定的散列值(数据摘要),通过签名者(CA机构)的私钥加密->签名

原始数据+签名->证书

不直接加密形成签名,要先hash形成摘要的原因:

  • 缩小签名密文的长度,加快数字签名的验证签名的运算速度

HTTPS如何安全握手

非对称加密+对称加密+证书认证:

image-20230720004215192

证书认证:客户端使对证书内的原始数据使用哈希散列,生成固定散列值,用内置的CA机构公钥进行解密,与证书内的签名进行对比。

中间人篡改替换的方法:ARP欺骗、ICMP攻击、假wifi&&假网站等。

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

  • 第一组(非对称加密):用于校验证书是否被篡改。服务器持有私钥(私钥在形成CSR文件与申请证书时获得),客户端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥)。服务器在客户端请求是,返回携带签名的证书。客户端通过这个公钥进行证书验证,保证证书的合法性,进一步保证证书中携带的服务端公钥权威性。

  • 第二组(非对称加密):用于协商生成对称加密的密钥。客户端用收到的CA证书中的公钥(是可被信任的)给随机生成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密密钥.

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

其实一切的关键都是围绕这个对称加密的密钥,其他的机制都是辅助这个密钥工作的。第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器, 第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pytorch工具——pytorch中的autograd

目录 关于torch.tensor关于tensor的操作关于梯度gradients 关于torch.tensor 关于tensor的操作 x1torch.ones(3,3) xtorch.ones(2,2,requires_gradTrue) print(x1,\n,x)yx2 print(y) print(x.grad_fn) print(y.grad_fn)zy*y*3 outz.mean() print(z,out)注意 atorch.randn(2,…

Zabbix监控

文章目录 Zabbix基本概念zabbix介绍zabbix特性zabbix结构 安装和配置Zabbix节点规划案例实施基础环境配置Zabbix安装安装和配置数据库启动zabbix服务 Zabbix界面(1)登录界面(2)中文界面(3)修改登录密码(4)添加被监控机器(5)图形乱码解决(6)发送告警到邮箱创建动作添加操作邮件发…

行为型模式 - 访问者模式

概述 定义&#xff1a; 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 结构 访问者模式包含以下主要角色: 抽象访问者&#xff08;Visitor&#xff09;角色&#xff1a;定义了对每一个元素&…

通过自动化单元测试的形式守护系统架构

目录 0前言 1 背景 2 为什么选择 Archunit 3 Archunit 是什么 4 引入 Archunit 4.1 开始就是如此简单 4.2 如何组织架构规则 4.3 团队如何规范化 0前言 通过自动化单元测试的形式守护系统架构是一种有效的方式&#xff0c;可以确保系统在不断演进和修改的过程中保持稳…

关于Swift中闭包和OC中block对局部变量基本数据类型值的捕获

翻了很多文章&#xff0c;发现关于Swift闭包关于上下文变量捕获这块&#xff0c;都没有说的很详细&#xff0c;或者Swift2这样的老版本已经不适用了&#xff0c;问了GPT也是和自己实验的结果不一样&#xff0c;记录下来。 一&#xff1a;OC的block 首先&#xff0c;回顾一下O…

java本地socket服务端暴露至公网访问【内网穿透】

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初…

JavaScript中truthy(真值)或者Falsy(假值)

● 在JavaScript中&#xff0c;有五个值是falsy ○ 0 ○ ’ ’ ○ undefined ○ null ○ NaN 除此之外&#xff0c;任何不是空值的都是真值&#xff1b; 假值是什么意思呢&#xff1f;就是转换为布尔值都是false&#xff0c;反则就是true 例如&#xff1a; console.log(Boole…

[ 容器 ] Docker 的数据管理

目录 一、Docker 的数据管理1.1 数据卷2. 数据卷容器 二、 端口映射三、容器互联&#xff08;使用centos镜像&#xff09;四、Docker 镜像的创建1&#xff0e;基于现有镜像创建2&#xff0e;基于本地模板创建3&#xff0e;基于Dockerfile 创建3.1 联合文件系统&#xff08;Unio…

【Matlab】基于遗传算法优化 BP 神经网络的时间序列预测(Excel可直接替换数据)

【Matlab】基于遗传算法优化 BP 神经网络的时间序列预测&#xff08;Excel可直接替换数据&#xff09; 1.模型原理2.文件结构3.Excel数据4.分块代码4.1 arithXover.m4.2 delta.m4.3 ga.m4.4 gabpEval.m4.5 initializega.m4.6 maxGenTerm.m4.7 nonUnifMutation.m4.8 normGeomSel…

【Linux从入门到精通】进程的控制(进程退出+进程等待)

本篇文章主要讲述的是进程的退出和进程等待。希望本篇文章的内容会对你有所帮助。 文章目录 一、fork创建子进程 1、1 在创建子进程中操作系统的作用 1、2 写时拷贝 二、进程终止 2、1 常见的进程退出 2、2 进程的退出码 2、2、1 运行结果正确实例 2、2、2 运行结果不正确实例…

怎样原生制作lis的CentOS容器镜像

本文介绍从一个空白的裸机CentOS自己构造检验允许的docker环境。来达到运行环境的高度定制&#xff0c;而不是只能依赖VS或者微软或者数据库厂商提供的镜像当做基础制作。更容易理解基础原理。最终输出产物为lisnew.tar&#xff0c;一个开箱即用的lis运行环境。 制作的整个过程…

1 快速构建mybatis项目

1.1 使用Maven的quickstart框架 注意是不出现w的quickstart&#xff1a; 1.2 加入依赖 <dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</s…

AIGC分享交流平台、GPT-4、GPT实时联网、Claude

拥有无限畅谈的AI个人助理&#xff0c;提高效率和创造力&#xff0c;引领未来的智能生活&#xff1b; 不仅承载着最前沿的科技理念&#xff0c;更集成了对人工智能可能性的深度理解。 已支持基于GPT、Claude等主流大模型的对话内容生成、支持GPT联网查询实时信息&#xff1b;基…

软件外包开发代码管理工具

在多人开发的软件中必然需要软件代码管理工具来协助&#xff0c;软件代码管理工具主要包括版本控制系统和代码仓库。以下是一些常见的软件代码管理工具&#xff0c;以及它们的一些主要特点&#xff0c;这些代码管理工具根据实际需求和开发团队的大小、目标和需求&#xff0c;都…

Jenkins环境配置篇-邮件发送

作为持续集成的利器Jenkins已经得到了广泛地应用&#xff0c;仅仅作为一个工具&#xff0c;Jenkins已然有了自己的生态圈&#xff0c;支持其的plugin更是超过1300。在实际中如何使用以及如何更好地使用jenkins&#xff0c;一直是大家在实践并讨论的。本系列文章将会从如何使用j…

HTTP中GET请求和POST请求的区别

前言 HTTP&#xff08;超文本传输协议&#xff09;是用于在 Web 浏览器和 Web 服务器之间传输数据的协议。在 HTTP 中&#xff0c;GET 和 POST 是两种常见的请求方法。一般我们在浏览器输入一个网址访问网站都是 GET 请求&#xff1b;在 FORM 表单中&#xff0c;可以通过设置 …

文件被识别为病毒,被删除,如何解决

我们的文件有时候有用&#xff0c;但是电脑却识别为病毒&#xff0c;直接给我删除掉了&#xff0c;这让人是真的很XX&#xff0c;那该怎么办呐。 我最近用了这个方法很多次&#xff0c;蛮好用&#xff0c;分享给大家&#xff01; 1、先找到安全中心 2、找不到排除项 3、点击添…

详细总结Webpack5的配置和使用

打包工具 使用框架&#xff08;React、Vue&#xff09;&#xff0c;ES6 模块化语法&#xff0c;Less/Sass 等 CSS预处理器等语法进行开发的代码要想在浏览器运行必须经过编译成浏览器能识别的 JS、CSS 等语法&#xff0c;才能运行。 所以需要打包工具帮我们做完这些事。除此之…

面试 | 双法妙解压缩字符串【遍历统计 + 双指针】

一、题目描述 原题传送门 二、思路分析 首先我们来分析一下解决本题所需要的思路 题目的意思很简单&#xff0c;就是统计原本的字符串中的每个字符出现的次数&#xff0c;然后以【字符&#xff0c;出现的次数】这样的结构来字符串&#xff0c;以起到一个压缩的效果&#xff0c…

概率论和随机过程的学习和整理--番外16,N合1的合成问题的求平均个数,次数,阶数

目录 1 问题 2 用条件期望&#xff0c;求合成的次数 2.1 思路1 2.2 思路2 3 用条件期望&#xff0c;求合成的个数 3.1 令X表示用材料1往上合成时&#xff0c;合成材料2的个数 3.2 令Y表示用材料1往上合成时&#xff0c;合成材料3的个数 4 用条件期望&#xff0c;求合成…
最新文章