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

【应用层】HTTPS协议详细介绍

文章目录

  • 前言
  • 一、什么是"加密"
  • 二、常见的加密方式
  • 三、数据摘要(数据指纹)
  • 四、证书
  • 总结


前言

HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层,由于HTTP协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况,下面我们详细介绍https是如何解决这些问题的。


一、什么是"加密"

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

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

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

下面我们举个例子:

比如我们的客户端要给服务器发送一个变量a = 100,这个变量的多少不想被其他人知道,所以我们用key变量按位异或a形成c变量,将c变量发送给服务器,然后服务器用c变量按位异或key就得到了a变量,我们发现只有在客户端一开始知道a是100,中间在网络传输的时候传输的都是c变量。

上面对a变量异或的过程就是加密,服务器对c变量异或得到a变量的过程就叫解密。

下面我们举一个非常常见的例子:

当我们需要下载某个游戏时,在浏览器搜到后然后开始下载,最后发现下载出来的是应用宝??这是因为当我们的浏览器向游戏服务器发起请求,游戏服务器向我们发起的回应包含游戏下载路径但是被运营商劫持,运营商将游戏路径改为应用宝的路径,然后发送给用户。

由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络设备就可以解析出你传输的数据内容并进行篡改,当我们点击下载按钮,实际上就是给服务器发送了http请求,获取到的http响应其实就包含了该APP的下载链接,运营商劫持后就自动的把交给用户的响应篡改为其他应用的下载地址了。

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

二.常见的加密方式

对称加密:采用单钥密码系统的加密方式,同一个秘钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单秘钥加密,特征:加密和解密所用的秘钥是相同的。

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

实际上我们上面演示的异或就是对称加密,两边都有key就能完成加密和解密。

非对称加密:需要两个秘钥来进行加密和解密,这两个秘钥是公开秘钥和私有秘钥。

特点:算法强度复杂,安全性依赖于算法与秘钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。

非对称加密要用到两个秘钥,一个叫做公钥,一个叫做私钥。公钥和私钥是配对的,最大的缺点是运算速度非常慢,比对称加密要慢很多。

三.数据摘要(数据指纹)

数据指纹(数据摘要):其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要,数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。

摘要特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据比对。

有了上面三组概念,下面我们探究一下http是如何加密的:

1.只使用对称加密可以解决问题吗?

 当我们客户端给服务端发送数据时,首先自己通过算法生成一个秘钥然后对数据加密,但是我们的服务端是没有客户端生成的秘钥的,要想对加密的数据解密还需要客户端把秘钥发送给服务端,但是我们说过http是明文的,这就导致客户端给服务端发送的秘钥也会被中间人(黑客)劫持,所以我们单单使用对称加密是解决不了问题的。

2.只使用非对称加密

首先我们假设只有服务端有公钥和私钥:

 当客户端向服务端发起秘钥协商握手的时候,服务端会给客户端发送公钥,但是黑客这个时候也会拿到公钥,然后客户端用公钥对数据加密发送给服务器,这里一定可以保证数据只会被服务器解密,因为私钥只有服务器有。服务器解密后要给客户端回应,但是服务器的回应是无法加密的,因为如果用公钥加密,就必须用私钥解密,而客户端并没有私钥,如果用私钥加密,那么黑客是有公钥的,还是会篡改信息。

下面我们假设客户端和服务端都用非对称加密:

首先客户端和服务端都有自己生成的公钥和私钥,第一次协商握手的时候客户端将自己的公钥给服务端,然后服务端发送响应的时候把自己的公钥给客户端,当两边交换公钥后客户端就可以用服务端的公钥加密数据发送给服务端,然后服务端用自己才有的私钥进行解密,然后服务器用客户端的公钥加密响应发送给客户端,客户端用只有自己才有的私钥进行解密。这样看似没有问题,但是我们说过非对称加密的速度很慢,并且有一个隐藏的安全问题我们在下一个方法中讲到。

3.为了解决效率问题,我们用对称加密 + 非对称加密组合的方法 

 首先服务端自己是有公钥和私钥的,然后第一次客户端向服务端发起请求,服务端将公钥给了客户端,客户端自己生成对称秘钥,然后用服务器的公钥对对称秘钥进行加密得到x,然后把x给服务端,因为只有服务端有唯一的秘钥所以可以对x进行解密拿到C,这样的话客户端和服务端都有了对称秘钥C,以后就可以通过对称秘钥加密通信了,我们说过对称秘钥速度很快,所以解决了速度慢的问题。 

我们发现上面的所有方案我们都忽略了一个问题,那就是如果中间人一开始就进行攻击,我们是无法完成正确的公钥交换的,如下图:

 首先服务端有自己的公钥P和私钥S,然后客户端第一次向服务器发起请求,然后服务器在给客户端发送P的时候被黑客劫持,黑客也准备了自己的私钥D和公钥M,然后黑客保存了服务器的公钥P,将自己的公钥M发送给客户端,客户端形成对称秘钥C,用黑客的公钥进行加密然后发送给服务端,在发送途中被黑客劫持,黑客用自己唯一的私钥D对X进行解密,拿到客户端形成的对称秘钥C,然后再用原先服务器的公钥P对C进行加密然后发送给服务端,服务端收到后用唯一的私钥S解密拿到了对称秘钥C,然后以后就用C和客户端通信,但是不管是服务端还是客户端都不知道黑客已经拿到对称秘钥C了。

那么如何解决上面这个问题呢?实际对上面这种情况我们只需要解决一开始黑客篡改公钥的情况,本质问题是客户端没有辨别公钥是否合法的能力,所以只要客户端能辨别公钥合法就能解决这个问题。

在解决这个问题之前我们先引入一些概念:

四.证书

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

 在数字证书中包含一个电子签名,这个我们后面会详细讲。然后还有公司的信息以及域名等等最重要的是公钥在证书中。

下面我们重点认识一下数字签名的形成:

首先公司提交公司注册信息,然后CA机构通过哈希散列将这份数组变成一个散列值(也叫数据摘要),然后CA机构会用CA自己的秘钥对散列值进行加密,加密后就形成了数据签名。注意:CA机构所使用的秘钥只有CA机构有。 有了数字签名后,我们要确保一份证书的真实性只需要将证书中的内容提取出来做数据摘要,然后用证书中的公钥对数据摘要解密,如果解密后的值和数字签名一样,则说明这个证书是真实的没有被篡改过,否则就说明证书是被篡改过的。

申请证书的过程如下图:

防篡改过程如下图:

 注意:CA会在所有的浏览器中内置自己的公钥,这一点非常重要。正是因为这样所以我们的浏览器才可以分辨出哪些网站是受信任的哪些网站是不受信任的。

下面我们分析一下为什么有了CA后就可以解决问题了:

1.黑客修改公钥可行吗?

很明显是不行的,如果黑客劫持了服务器给客户端发送的证书并且修改了证书中的公钥(注意证书中的公钥是服务器自己生成的公钥,与我们签名讲解的方案中的公钥是一样的),由于CA生成证书的时候会将公司提交的公钥信息,注册信息等全部进行摘要然后用CA自己的私钥加密,所以一旦客户端浏览器用CA内置的公钥对证书中的数字签名解密,然后和证书中的数据摘要做对比,只要不一样则说明证书被篡改。

2.黑客同时修改公钥和数字签名

当然也是不行的,因为数字签名的修改必须要CA机构的私钥。

3.黑客直接掉包整个证书

首先黑客肯定造不出假证书,因为没有CA的私钥。要拥有证书就必须去CA机构申请真证书,但是证书中是含有域名等信息的,每个服务器的域名是唯一的,如果你拿着别人已经申请过的公司的域名那么一定申请不到证书的。

 了解了以上知识,那么最终方案就来了:非对称加密+对称加密+证书认证

首先服务端自己是有公钥和私钥的,然后第一次客户端向服务端发起请求,服务端将证书给了客户端,客户端自己生成对称秘钥,然后用证书中的公钥对对称秘钥进行加密得到x,然后把x给服务端,因为只有服务端有唯一的秘钥所以可以对x进行解密拿到C,这样的话客户端和服务端都有了对称秘钥C,以后就可以通过对称秘钥加密通信了。证书的存在解决了中间人一开始就对公钥做手脚的场景,所以这就是https的加密原理。

当然我们也可以在自己的浏览器查看相关的证书:

 上面除了CA以外的机构很多都是CA的子机构。

 可以看到不管公钥还是私钥都是一堆代表唯一性的字符串。


总结

https与http最本质的区别在于https在http的基础上引入了加密层,以前http明文发送的数据在https中可以进行加密了,极大的提高了安全性。

相关文章:

【应用层】HTTPS协议详细介绍

文章目录 前言一、什么是"加密"二、常见的加密方式三、数据摘要(数据指纹)四、证书总结 前言 HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层,由于HTTP协议内容都是按照文本的方式明文传输的&#xff…...

【Tensorboard+Pytorch】使用注意事项

安装 tensorboard/tensorboardx版本需要与tensorflow保持一致(本人使用2.2) 调用 环境变量 在终端或CMD中使用时,常见报错“tensorboard 不是内部或外部命令……”,需要添加环境变量路径path。具体为tensorboard.exe所在目录(A…...

设计模式行为型——命令模式

目录 什么是命令模式 命令模式的实现 命令模式角色 命令模式类图 命令模式举例 命令模式代码实现 命令模式的特点 优点 缺点 使用场景 注意事项 什么是命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属…...

13-2_Qt 5.9 C++开发指南_线程同步_QMutex+QMutexLocker(目前较为常用)

文章目录 1.线程同步的概念2. 基于互斥量的线程同步3.QMutex实现线程同步源代码3.1 qdicethread.h3.2 qdicethread.cpp3.3 dialog.h3.4 dialog.cpp 4.QMutexLocker 实现线程同步源代码4.1 qdicethread.h4.2 qdicethread.cpp4.3 dialog.h4.4 dialog.cpp 1.线程同步的概念 在多线…...

金融行业选择哪种SSL证书才安全可靠

由于金融领域等网站拥有大量客户的敏感信息,且每天都有大量交易需要进行,涉及到大量的资金问题,当这些机构提供的网络和Web应用程序没有足够的安全措施来阻止黑客窃取数据时,就会出现严重的安全问题。而且由于黑客每天都在开发越来…...

面试总结(三)

1.进程和线程的区别 根本区别:进程是操作系统分配资源的最小单位;线程是CPU调度的最小单位所属关系:一个进程包含了多个线程,至少拥有一个主线程;线程所属于进程开销不同:进程的创建,销毁&…...

青大数据结构【2016】

一、单选 二、简答 3.简述遍历二叉树的含义及常见的方法。 4.简要说明图的邻接表的构成。 按顺序将图G中的顶点数据存储在一维数组中, 每一个顶点vi分别建立一个单链表,单链表关联依附顶点vi的边(有向图为以vi为尾的弧)。 邻接…...

聊聊拉长LLaMA的一些经验

Sequence Length是指LLM能够处理的文本的最大长度,越长,自然越有优势: 更强的记忆性。更多轮的历史对话被拼接到对话中,减少出现遗忘现象 长文本场景下体验更佳。比如文档问答、小说续写等 当今开源LLM中的当红炸子鸡——LLaMA…...

线程池的使用详解

一 使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。 线程池提供了一种限制和管理资源(包括执行一个任…...

刷题笔记 day4

力扣 611 有效三角形的个数 首先需要知道如何判断 三个数是否能构成三角形。 假如 存在三个数 a < b < c&#xff0c;如果要构成三角形&#xff0c;需要满足&#xff1a; ab > c ; a c > b ; b c > a ; 任意两个数大于第三个数就可构成三角形。 其实不难…...

Python 2.x 中如何使用flask模块进行Web开发

Python 2.x 中如何使用 Flask 模块进行 Web 开发 引言: 随着互联网的快速发展&#xff0c;Web开发成为了互联网行业中一项非常重要的技术。而在 Python 的Web开发中&#xff0c;Flask框架是一种非常流行的选择。它简单轻巧&#xff0c;灵活易用&#xff0c;适合中小型项目的快…...

spring websocket 调用受权限保护的方法失败

版本 spring-security 5.6.10 spring-websocket 5.3.27 现象 通过AbstractWebSocketHandler实现websocket端点处理器 调用使用PreAuthorize注解的方法报错&#xff0c;无法在SecurityContext中找到认证信息 org.springframework.security.authentication.AuthenticationCred…...

Vue.js2+Cesium 四、模型对比

Vue.js2Cesium 四、模型对比 Cesium 版本 1.103.0&#xff0c;低版本 Cesium 不支持 Compare 对比功能。 Demo 同一区域的两套模型&#xff0c;实现对比功能 <template><div style"width: 100%; height: 100%;"><divid"cesium-container"…...

Linux 之 Vi 编辑器

文章目录 1. vi/vim介绍2. vi/vim使用详解2.1 vi/vim的特点2.2 vi/vim三种编辑模式2.3 文本编辑方式 1. vi/vim介绍 vi编辑器是linux和unix上最基本的文本编辑器&#xff0c;工作在字符模式下。由于不需要图形界面&#xff0c;vi是效率很高的文本编辑器。尽管在linux上也有很多…...

Python超实用!批量重命名文件/文件夹,只需1行代码

大家好&#xff0c;这里是程序员晚枫&#xff0c;之前在小破站给大家分享了一个视频&#xff1a;批量重命名文件。 最近在程序员晚枫的读者群里&#xff0c;发现很多朋友对这个功能很感兴趣&#xff0c;尤其是对下一步的优化&#xff1a;批量重命名文件夹。 这周我利用下班时…...

sqoop

一、bg 可以在关系型数据库和hdfs、hive、hbase之间导数 导入&#xff1a;从RDBMS到hdfs、hive、hbase 导出&#xff1a;相反 sqoop1 和sqoop2 (1.99.x)不兼容&#xff0c;sqoop2 并没有生产的稳定版本&#xff0c; Sqoop1 import原理(导入) 从传统数据库获取元数据信息&…...

PySpark 数据操作(综合案例)

搜索引擎日志分析 要求&#xff1a; 读取文件转换成RDD&#xff0c;并完成&#xff1a; 打印输出&#xff1a;热门搜索时间段&#xff08;小时精度&#xff09;Top3打印输出&#xff1a;热门搜索词Top3打印输出&#xff1a;统计黑马程序员关键字在哪个时段被搜索最多将数据转…...

产品经理如何平衡用户体验与商业价值?

近期负责前端产品设计工作的小李忍不住抱怨&#xff1a;公司总是要求客户第一&#xff0c;实现客户良好体验&#xff0c;但在实际操作过程中&#xff0c;面向用户 体验提升的需求&#xff0c;研发资源计划几乎很难排上&#xff0c;资源都放在公司根据业务价值排序的需求…...

【PostgreSQL】系列之 一 CentOS 7安装PGSQL15版本(一)

目录 一、何为PostgreSQL&#xff1f; 二、PostgreSQL安装 2.1安装依赖 2.2 执行安装 2.3 数据库初始化 2.4 配置环境变量 2.5 创建数据库 2.6 配置远程 2.7 测试远程 三、常用命令 四、用户创建和数据库权限 一、何为PostgreSQL&#xff1f; PostgreSQL是以加州大学…...

Nginx解决文件服务器文件名显示不全的问题

Nginx可以搭建Http文件服务器&#xff0c;但默认的搭建会长文件名显示不全&#xff0c;比如如下&#xff1a; 问题&#xff1a;显示不全&#xff0c;出现...&#xff0c;需要进行解决 这里使用重新编绎nginx的方式&#xff0c;见此文&#xff1a; https://unix.stackexchange…...

IO进程线程第四天(8.1)

作业1&#xff1a; 从终端获取一个文件的路径以及名字。 若该文件是目录文件&#xff0c;则将该文件下的所有文件的属性显示到终端&#xff0c;类似ls -l该文件夹 若该文件不是目录文件&#xff0c;则显示该文件的属性到终端上&#xff0c;类似ls -l这单个文件 #include<…...

WAF绕过-权限控制篇-后门免杀

WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 1、什么是WAF&#xff1f; Web Application Firewall&#xff08;web应用防火墙&#xff09;&#xff0c;一种公认的说法是“web应用防火墙通过执行一系列针对HTTP/HTTPS的安…...

LED灯的驱动,GPIO子系统,添加按键的中断处理

1.应用程序发送指令控制LED亮灭 2.按键1 按下&#xff0c;led1电位反转 按键2按下&#xff0c;led2电位反转 按键3 按下&#xff0c;led3电位反转 驱动程序&#xff1a; #include <linux/init.h> #include <linux/module.h> #include<linux/of.h> #include…...

Gradle和Maven的区别

Gradle和Maven 当涉及到构建和管理项目时&#xff0c;Gradle和Maven是两个非常流行的选项。本文将讨论Gradle和Maven之间的区别以及它们的配置信息差异。 1. Gradle和Maven的区别 1.1 构建脚本语言 Maven使用XML作为构建脚本语言&#xff0c;而Gradle使用基于Groovy的DSL&…...

C#中 使用yield return 优化大数组或集合的访问

概要 我们在开发过程中&#xff0c;经常需要在一个很大的数组或集合中搜索元素&#xff0c;以满足业务需求。 本文主要介绍通过使用yield return的方式&#xff0c;避免将大量数据全部加载进入内存&#xff0c;再进行处理。从而提高程序的性能。 设计和实现 基本业务场景&a…...

ROS实现导航中止(pub命令版+C++代码版)

pub命令 rostopic pub /move_base/cancel actionlib_msgs/GoalID -- {}C代码&#xff1a; stop_navigation.cpp #include <ros/ros.h> #include <geometry_msgs/Twist.h> #include <nav_msgs/Odometry.h> #include <sys/time.h> #include <unistd…...

【VTK】读取一个 STL 文件,并使用 Qt 显示出来,在 Windows 上使用 Visual Studio 配合 Qt 构建 VTK

知识不是单独的&#xff0c;一定是成体系的。更多我的个人总结和相关经验可查阅这个专栏&#xff1a;Visual Studio。 文章目录 A.hA.cppRef. 直接先把效果放出来&#xff0c;有需要就往下看。 A.h // A.h #pragma once#include <QtWidgets/QMainWindow> #include "…...

数据结构--基础知识

数据结构是什么&#xff1f; 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式&#xff0c;以便能够高效地使用和访问数据。 相关内容 基本组成 数组&#xff08;Array&#xff09;&#xff1a;数组是一种线性数据结构&#xff0c;…...

天工开物 #7 Rust 与 Java 程序的异步接口互操作

许多语言的高性能程序库都是建立在 C/C 的核心实现上的。 例如&#xff0c;著名 Python 科学计算库 Pandas 和 Numpy 的核心是 C 实现的&#xff0c;RocksDB 的 Java 接口是对底层 C 接口的封装。 Rust 语言的基本目标之一就是替代 C 在这些领域的位置&#xff0c;为开发者提供…...

python实现视频转GIF动图(无水印,包含代码详解和.exe执行文件)

该代码提供了一个简单的界面&#xff0c;允许用户将视频转换为GIF动画&#xff0c;并且可以自定义采样率、GIF帧率和输出大小。修改后的代码将视频帧的大小调整为固定的尺寸&#xff0c;并在生成GIF动画时保持这个尺寸。 一、核心代码实现 核心代码如下&#xff1a; import c…...