HTTP与HTTPS原理

news/2024/3/29 9:41:44/文章来源:https://blog.csdn.net/u014801954/article/details/129089205

目录

HTTP

协议背景

协议格式

请求行

请求报头

请求正文(有效载荷)

响应行

HTTPS原理

协议背景

什么是加密?

为什么要加密?

加密方式

数据摘要(数据指纹)

协议加密方案实现探究

方案一:只使用对称加密

方案二:只使用非对称加密

方案三:双方都使用非对称加密

方案四:对称加密和非对称加密结合

方案五:非对称加密 + 对称加密 + 证书认证

总结


虽然应用层协议是我们程序猿自己定的,但已经有大佬们定义了一些现成的, 又非常好用的应用层协议了,供我们直接参考使用,HTTP和HTTPS就是应用层协议。

HTTP

协议背景

HTTP(Hyper Text Transfer Protocol)协议即超文本传输协议,诞生于1990年。

我们熟知的网址其实是URL,URI表示统一资源标识符,URL表示统一资源定位符,URL是URI的子集,也可以用URL替换URI,绝对URI的格式如下:

协议方案名:表示使用的协议,后加冒号

登录信息:表示指定用户和密码从服务器获取资源必要的登录信息,是可选项

服务器地址:使用绝对URI必须指定地址,地址可以是DNS可以解析的域名,也可以是IPv4或IPv6地址,我们常使用的域名最终也转化为IP地址

端口号:表示服务器使用的端口号,可选项,省略时使用默认端口,比如http使用80端口,https使用443端口,sshd使用22端口

带层次的文件路径:表示从服务器上的文件路径定位资源,通常是相对路径,与Linux文件系统类似

查询字符串:针对已指定的文件路径下的资源,可以使用查询字符串传入任意参数,可选项

片段标识符:可选项,标记已获取资源的子资源

服务器地址:我们常使用的域名最终也转化为IP地址,使用ping命令可以查看IP地址:

 使用wget命令可以获取网站的html资源:

url中的编码和解码:

在url中像?:这些字符是有特殊意义的,当参数中带有这些字符就必须进行转义,比如:

1+2被编码成了1%2B2,也就是+变成了%2B。

编码时,将需要转码的字符转为16进制,从右到左取四位,每两位做一位,前面加上%.

使用encode和decode工具进行转换:

协议格式

请求格式: 

请求行:请求方法+ ur+ 协议版本 + \r\n
请求报头Header: 请求的属性,使用冒号分割的键值对;每组属性之间使用\r\n分隔;最后以空行+\r\n表示Header部分结束
请求正文Body: 空行后面的内容都是Body。 Body允许为空字符串,如果Body存在,则在Header中会有一个Content-Length属性来标识Body的长度。

响应格式:

响应首行:[版本号] + [状态码] + [状态码解释]
响应报头Header:请求的属性,冒号分割的键值对;每组属性之间使用\r\n分隔;遇到空行表示Header部分结束
响应正文Body: 空行后面的内容都是Body,Body允许为空字符串。如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度;如果服务器返回了一个html页面, 那么html页面内容就是在body中

可以看出除了首行请求和响应的格式是类似的。 

请求行

请求方法+ url + 协议版本 + \r\n

常见请求方法:

常用请求方法:

GET:获取远端资源到本地或者提交属性字段到远端

POST:提交属性字段到远端

GET和POST的区别:在提交表单的时候,GET是以明文方式作为参数拼接到url中,这种直接通过url传参的方式不私密;而POST将参数以明文的方式拼接到http正文(body)中,这种通过正文传参的方式较为私密,一般较大的内容通过POST传参。为什么提到私密的概念?原因是表示不能明显看到的意思,但是他们都不是安全的,因为都通过明文传参。

url:url中的/不是根目录,而是web根目录,通常不是根目录,服务端通常会内部添加实际目录的前缀。

请求报头

请求报头由多行 key: value\r\n组成

常见header

Host:表示服务器主机的地址和端口

User-Agent:用户的OS和浏览器的版本信息

Refer:表示当前页面是从哪个页面跳转过来

Cookie:在本地保持客户端数据,实现会话功能

为什么需要Cookie?

        http协议特点是无状态,不记录用户访问记录,但是用户需要会话保持 ,一旦登陆会有会话保存策略,首次访问时,客户端往cookie文件(浏览器维护的文件,磁盘或内存级文件)写入内容,下次请求访问时自动从cookie文件写入用户名和密码,但是这样是不安全的,所以采用cookie+session方案保存用户临时的私密信息,首次访问服务端的时候不带cookie,服务端通过set-cookie字段返回键值对,浏览器拿到值后保存在本地,下次访问的时候发送cookie信息,这样服务端就能识别到就知道是哪个用户在访问了,cookie保存在文件中自动形成session文件的文件名session_id,文件名具有唯一性,访问时将session_id写入到本地的cookie。当服务端识别登陆位置异常时,让sessions_id失效,保护用户安全。

connection:链接类型 

早期都是短链接,用closed表示短链接,用keep-alive表示保持链接,即长链接。

Content-Type: 传输的数据类型(text/html等)
Content-Length:正文Body的长度
location:表示要重定向的网址,搭配3xx状态码使用,告诉客户端接下来要去哪里访问

请求报头以一行空行+\r\n结尾。

请求正文(有效载荷)

正文含登陆账号和密码,个人信息,音频,视频等信息。

如何读取完整报头?

按行读取,直到读取到空行,因为请求报头的最后一行是空行+\r\n。

如何保证读取到完整正文?

请求或响应报头属性中,包含正文长度content-length

响应行

协议版本(比如 http/1.1)+ 状态码 + 状态码描述 + \r\n

HTTP状态码:

3XX 重定向状态码

301:永久重定向

302:临时重定向,需要完整网址,否则是站内重定向 

pipeline技术:按顺序返回响应,HTTP 流水线 HTTP 流水线是 HTTP/1.1 的一个特性,它允许在一个 TCP (传输控制协议)连接上发送多个 HTTP 请求,而无需等待相应的响应。HTTP/1.1规范要求服务器正确响应流水线化的请求,即使服务器不支持 HTTP 流水线化,也要返回非流水线化但有效的响应。 

HTTPS原理

协议背景

前面提到http协议通过正文或url传参时都是使用明文传参,所以是http是不安全的协议。

为了保证安全在http协议的基础上引入了一个加密层 SSL/TLS,和称https协议。

什么是加密?

加密就是将明文经过一系列的变换变成密文,解密就是将密文经过一系列的变换变成明文,其中辅助加密和解密过程的中间数据就是密钥。

为什么要加密?

以前我们在网页中下载资源A的时候却弹出下载B资源的链接,这种情况是因为网络在数据传输的过程中需要经过运营商的网络设备,因为http协议通过明文传输数据,所以网络设备就很容易通过解析传输的数据并进行篡改,再次转发,这就是臭名昭著的运营商劫持,不止是运营商,其他黑客也可以通过这种类似手段获得用户的信息,从而谋取利益。所以更安全的协议需要被使用来保证用户的安全,https正为此而存。

加密方式

对称加密:使用单密钥加密,也就是加密和解密的密钥是相同的

常见对称加密算法:DES、3DES等

特点:算法公开,计算量小,加密速度快,加密效率高

非对称密钥:需要使用两个密钥(公钥和私钥)来加密和解密

常见非对称加密算法:RSA,DSA,ECDSA

特点:相比对称加密运算速度非常慢,使用公钥加密,私钥解密,反着来也行

数据摘要(数据指纹)

原理:通过单向散列函数将文本生成数字摘要,用来判断数据是否被篡改 

摘要常见算法:有MD5、SHA1、SHA256、SHA512等,因为哈希算法是把无限映射成有限,因此可能会有碰撞。

特点:这种算法不算加密,因为不可逆,很难反推原数据,通常用于数据比对

应用场景:如网盘的妙传,通过比对数据生成的数字摘要,然后在服务器上通过摘要查找是否存储了副本,倘若存储了副本就不必再拷贝一份到服务器端存储了,直接存储其在服务器上对应数据的链接就可以了,这样的策略提高了上传的效率,同时也节省了存储空间。

数字签名摘要通过加密变成数字签名

协议加密方案实现探究

方案一:只使用对称加密

倘若密钥只有客户端服务器知道,那么客户端数据通过密钥加密传给服务端,即使数据被中间人截取了,因为不知道密钥也就无法解密和篡改了,但是服务器是要服务多个客户端的,服务器要维护每个客户端和其的密钥的关系,每个客户端的密钥应当是不同的(相同的话容易扩散,黑客容易拿到),那么如何协商共同的密钥呢?理想的情况是,在双方第一次通信时约定好共同的密钥,但是如何传输密钥呢?传输密钥的过程可以会被拦截,获取密钥,又需要加密(死循环了),所以这种方案是行不通的。

方案二:只使用非对称加密

服务器传公钥给客户端,客户端发送的时候用公钥进行加密 ,服务器用私钥解密获得数据,这样一来中间人即使窃取了数据因为不知道私钥也就无法解密和破解了,所以客户端发给服务器是安全的,但是服务器发送给客户端就不安全了,因为中间人可以窃取公钥,服务器发送的消息用私钥加密,中间人可以使用公钥加密,这样一来服务端到客户端这条通路的数据就不安全了。

方案三:双方都使用非对称加密

针对方案二的服务端到客户端传输数据不安全的问题,提出了方案三,也就是使用两套公钥私钥,来保证两条通路的安全:

1.服务端拥有公钥S与对应的私钥S',客⼾端拥有公钥C与对应的私钥C'
2. 客户端和服务端交换公钥S和C
3. 客户端给服务端发信息:先用公钥S对数据加密,再发送,只能由服务器解密,因为只有服务器有私钥S',所以中间人没有私钥保证了客户端到服务端通路数据的安全。
4. 服务端给客户端发信息:先用公钥C对数据加密,在发送,只能由客⼾端解密,因为只有客⼾端有私钥C',所以中间人没有私钥保证了服务端到客户端通路数据的安全。

但是这样一来都使用非对称加密导致效率低下,而且仍然存在安全问题(后面谈)。

方案四:对称加密和非对称加密结合

为了解决方案三的效率低下的问题,引入对称加密和非对称加密的方案:

1.服务端拥有非对称公钥S和私钥S'、

2.客户端从服务端获取公钥S

3.客户端在本地生成对称密钥C通过公钥加密传送给服务端

4.服务端与客户端以后用对称密钥C来进行加密通信

这样一来,因为中间人没有私钥S',所以无法解密客户端生成的对称密钥C,所以也就无法解密以后服务端和客户端之间发送的数据,从而保证了安全,而且使用对称加密的通信提高了效率,解决了方案四的问题。但这样的方案仍然存在安全问题:

这种情况为中间人攻击(Man-in-the-MiddleAttack,简称“MITM攻击”)

原因在于第二步的公钥可能被替换:

客户端从服务端获取公钥S的过程,中间人截取了数据获得了公钥S并进行保存,然后中间人替换为自己持有的公钥M(中间人具有公钥M和私钥M')发给客户端,客户端无法知道数据报文是谁发的 ,以为是服务器的公钥,就将本地生成的对称密钥C通过中间人的公钥M进行加密传送给服务端,于是中间人截取数据通过自己的私钥M'解密获得了对称密钥C了,再将数据通过(之前服务端发来的,存储着)公钥S进行加密,发送给服务端。于是数据神不知鬼不觉地被中间人窃取而且随意篡改了,可见这种方案还是不安全的。

方案五:非对称加密 + 对称加密 + 证书认证

引入证书

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

证书如何保证了安全?

1.服务端生成了公私钥对,公钥和域名等信息生成CSR文件发生给CA机构,私钥则自己保存

2.CA机构审核信息后,将信号使用哈希函数形成数据摘要,再通过CA机构的私钥进行加密形成数字签名,数字签名附加到信息上就是证书,然后CA机构将证书颁发给服务器

3.服务端将证书发给客户端,客户端从系统中(系统安装自带的CA机构的公钥)获取公钥对签名解密,得到hash1,再计算整个证书的hash2,比对hash1和hash2确保证书没有被篡改

4.确保证书没被篡改后,然后客户端获取证书上的公钥S(服务器的公钥),并在本地生成对称密钥对C,将密钥C使用公钥S加密后发送给服务端。最后服务端客户端就能使用对称密钥C加密进行网络通信了。

如何解决公钥替换问题?

这个方案就解决了方案4公钥被替换的问题,因为黑客一旦替换公钥,意味着要修改证书的数据,但是修改了数据,因为没有CA机构的私钥,所以就无法再加密形成正确的数字签名,客户端进行证书认证的时候使用系统公钥解密时生成的hash1,客户端使用散列函数计算整个证书生成hash2,比对二值就能进行确定证书是否被篡改,一旦被篡改,客户端就能马上丢弃数据,不向其发送数据保证安全。

验证证书正确性如图:

 

为什么签名不直接加密,⽽是要先hash形成摘要?

        为了缩小签名的长度,加快数字签名的验证签名的运算速度

中间人掉包整个证书?

        因为中间⼈没有CA私钥,所以对任何证书都⽆法进⾏合法修改,包括⾃⼰申请的。中间人没有CA的私钥所以无法制作假的证书,所以中间⼈只能向CA申请真证书,然后⽤⾃⼰申请的证书进⾏掉包。倘若进行证书的整体掉包,但是证书明⽂中包含了域名等服务端认证信息,如果整体掉包,客⼾端依旧能够识别出来。

总结

通信过程:

三组密钥
第⼀组(非对称加密)(CA机构的):⽤于校验证书是否被篡改。CA机构持有私钥, 客⼾端持有公钥(操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥)。服务器在客⼾端请求后返回携带签名的证书。客⼾端通过这个公钥进⾏证书验证,保证证书的合法性,进⼀步保证证书中携带的服务端公钥权威性。
第⼆组(⾮对称加密)(服务端的): ⽤于协商⽣成对称加密的密钥。客⼾端⽤收到的CA证书中的公钥(是可被信任的) 给随机⽣成的对称加密的密钥加密,传输给服务器, 服务器通过私钥解密获取到对称加密密钥。
第三组(对称加密)(客户端的): 客⼾端和服务器后续传输的数据都通过这个对称密钥加密解密.
其实⼀切的关键都是围绕这个对称加密的密钥. 其他的机制都是辅助这个密钥⼯作的.
第⼀组⾮对称加密的密钥是为了让客⼾端拿到第⼆组⾮对称加密的公钥。第⼆组⾮对称加密的密钥是为了让客⼾端把这个对称密钥传给服务器。

 

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

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

相关文章

【云原生】初识Kubernetes的理论基础

一、kubernetes概述 1.1 kubernetes介绍 K8S的全称为Kubernetes (K12345678S),首字母与尾字母中间有8个字母,缩写为K8S 作用 用于自动部署、扩展和管理“容器化(containerized) 应用程序”的开源系统。可以理解成K8S是负责自动化运维管理多个容器化程序…

【云原生】k8s之Yaml文件详解

一、K8S支持的文件格式 kubernetes支持YAML和JSON文件格式管理资源对象。 JSON格式:主要用于api接口之间消息的传递YAML格式:用于配置和管理,YAML是一种简洁的非标记性语言,内容格式人性化,较易读 1、yaml和json的主…

[Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]

[Golang实战]github.io部署个人博客hugo[新手开箱可用][小白教程]1.新手教程(小白也能学会)2.开始准备2.1myBlog是hugo的项目1.安装Hugo2.创建hugo项目2.2 xxxx.github.io是github.io中规定的pages项目3.成功部署4.TODO自动化workflows部署github.io1.新手教程(小白也能学会) …

分析| 2023年移动开发平台的发展空间

春节过后返工已经过月,许多移动开发领域的企业都在忙着做技术调研与选型。在此之前,不如先回顾一下2022年的市场趋势,再结合好的移动开发平台的标准,从中窥见2023年的发展前景。 Gartner十大战略技术趋势 全球权威咨询机构Gartne…

分析称勒索攻击在非洲、中东与中国增长最快

Orange Cyberdefense(OCD)于 2022 年 12 月 1 日发布了最新的网络威胁年度报告。报告中指出,网络勒索仍然是头号威胁 ,也逐渐泛滥到世界各地。 报告中的网络威胁指的是企业网络中的某些资产被包括勒索软件在内的攻击进行勒索&…

2022-06-16_555时基的迷人历史和先天缺陷!

https://www.eet-china.com/news/magazine220608.html 555时基的迷人历史和先天缺陷! 发布于2022-06-16 03:39:12 LARRY STABILE 流行数十年的555时基,业内不知晓的工程师应该寥寥无几!几乎所有的数字电路教材中,都有该芯片的身影…

LeetCode 周赛 333,你管这叫 Medium 难度?

本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周是 LeetCode 第 333 场周赛,你参加了吗?这场周赛质量很高,但难度标得不对,我真的会谢。算法…

基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计

2.1 需求分析 本课题以龙芯 2K1000 处理器为嵌入式系统的处理器,需要实现一个完成的嵌 入式软件系统,系统能够正常启动并可以稳定运行嵌入式 Linux。设计网络设备驱 动,可以实现板卡与其他网络设备之间的网络连接和文件传输。设计 PCIE 设备驱…

重温一下C#的时间类型,并简单写一个定时器功能

🎉🎉 时间是一个非常抽象的概念,本篇文章我们不深究目前电脑上的时候是如何保持全网同步。主要是讲讲在使用C#编程语言里的时间类型。最后使用定时任务简单写一个提醒功能,比如:每天10点准时打开一次csdn首页&#xff…

yolov5源码解读--数据处理模块

yolov5源码解读--数据处理模块加载数据读取图片加载标签马赛克数据增强图片标签其他的数据增强变图像变标签__getitem__构建Batch加载数据 create_dataloader 跳转到datasets.py文件中,可以看到支持输入的文件类型非常丰富。。 回归正题 跳转LoadImagesAndLabel…

分析JEP 290机制的Java实现

简介 https://openjdk.org/jeps/290 Filter Incoming Serialization Data过滤传入的序列化数据 JEP290是Java官方提供的一套来防御反序列化的机制,其核心在于提供了一个ObjectInputFilter接口,通过设置filter对象,然后在反序列化&#xff…

c盘系统盘满了,无损扩容

磁盘管理 计算机-管理-磁盘管理 diskmgmt.msc1.选中c盘,右键选择扩展卷,如果是灰色,表示无法扩展 注意: 未分配区域不在同一磁盘,无法分配; 物理上不挨着的区域,无法分配; 2.把与c…

【Spring Cloud Alibaba】003-Nacos 概述与单机搭建

【Spring Cloud Alibaba】003-Nacos 概述与单机搭建 文章目录【Spring Cloud Alibaba】003-Nacos 概述与单机搭建一、Nacos 概述0、新技术学习思路推荐1、什么是 Nacos2、架构图架构图架构图信息二、Nacos 单机搭建1、下载与启动下载地址编辑 startup.cmd 文件下面对两种模式的…

cocos2d-x4.0 win10环境搭建

cocos2d-x默认只支持win32的版本,win64的我测试link不行 我搭建使用的环境 windows10vs2019py2.7cmake3 从GitHub上clone源码https://github.com/cocos2d/cocos2d-x coco2d-x默认带了submodule,有协同子模块,最好是一起下载,搞个…

破解遗留系统快速重构的5步心法(附实例)

前两天和一个架构师朋友闲聊,说到了 「重构」 这个话题,他们公司早年间上线的项目系统,因一直没专人在演进过程中为代码质量负责,导致现在代码越来越混乱,逐渐堆积成“屎山”,目前的维护成本已远高于重新开…

ubuntu server系统树莓派安装mysql8.0开启远程访问

文章目录前言博客一、安装mysql8.0二、创建一个远程访问的新用户三、在MySQL配置文件中启用远程访问。四、navicat15连接mysql8.0返回10061chatgpt回复前言 百度了半天没解决,问了下chatgpt成功解决了…… 博客 一、安装mysql8.0 确认MySQL 8.0服务器已安装并正在…

恺望数据:解决智驾数据生产痛点,提供自动化生产线和规模化人力

最近Chat GPT引起了一个热点话题,就是人工智能是否真的可以替代人类工作,特别是在需要进行数据标注等需要人力的领域。 自动驾驶数据服务公司恺望数据在最近的一个会议上透露了一些消息,他们已经推出了一个基于自动化的数据生产系统&#xff…

uniapp 引入彩色symbol和 指令权限

uniapp 引入iconfont图标库彩色symbol 1,先去阿里巴巴矢量图标库登录 然后点击下载至本地 2.下载本地,然后解压文件夹 3.打开终端cmd命令窗口 npm安装全局包npm i -g iconfont-tools 4.终端切换到上面解压的文件夹里面,运行iconfont-too…

idea 中的 profiles 详解

profile 主要是为了解决不同环境所需的不同变量、配置等问题. profile 一般出现在两个地方:settings.xml,pom.xml 在 settings.xml 时,一般用来做仓库的选择(只使用 aliyun 仓库可以这样配置 settings.xml) 在 pom.xml 时,一般…

EM算法总结

目录 一。Jensen不等式:若f是凸函数 二。最大似然估计 三。二项分布的最大似然估计 四。进一步考察 1.按照MLE的过程分析 2.化简对数似然函数 3.参数估计的结论 4.符合直观想象 五。从直观理解猜测GMM的参数估计 1.问题:随机变量无法直接…