SSL,TLS协议分析

写在前面

在这里插入图片描述
工作中总是会接触到https协议,也知道其使用了ssl,tls协议。但对其细节并不是十分的清楚。所以,就希望通过这篇文章让自己和读者朋友们都能对这方面知识有更清晰的理解。

1:tls/ssl协议的工作原理

1.1:设计的目的

网络是不安全的,因此一些敏感的信息,比如我们的银行账号密码,比如引爆原子弹的账号信息等。当以明文形式在网络上传输时不可避免的会被坏人看到,被坏人修改,等等,所以为了解决这些问题,就需要一种解决这种问题的方案,也就是一种安全相关的协议,也就是本文要分析的tls/ssl了。具体的解决了如下的问题们:

  • 身份验证
    证明你就是你
  • 保密性
    就算是坏人拿到了数据,也无法知道其具体内容是什么。
  • 完整性
    坏人拿到数据后,恶意修改了数据,我们能够知道数据已经被恶意篡改了。

1.2:协议组成

主要由两个自协议组成:

record 记录协议:对称加密
handshake 握手协议:验证身份协商密钥协商加密参数

自然,所有设计都是为了满足设计目的。

1.3:需要用到的知识点

为了解决数据加密的问题,需要用到对称加密算法,而为了传递对称加密算法的密钥,需要用到非对称加密算法,而为了进行身份验证,需要用到证书CA等内容。所以后续我们就以这些知识点作为切入点来进行分析。

2:知识点们

2.1:对称加密

加密密钥和解密密钥相同的加解密算法。

2.1.1:对称加密的原理

XOR异或运算,其真值表(truth table)表如下:
在这里插入图片描述
通过连续两次的异或运算就可以将数据恢复到初始状态,并且异或运算本身是操作系统底层支持的,速度也很快,所以用在对称加密的场景中是非常合适的。连续两次异或过程如下:

数据:1101
密钥:0101
第1次异或运算:1101 XOR 0101 = 1000
第2次异或运算:1000 XOR 0101 = 1101 可以看到恢复到了最初值

2.1.2:填充padding

当通过异或运算对数据进行加密时,要求进行异或运算时的数据和密钥长度相同,因为长度不相同时时无法进行异或运算的,所以就需要通过增加数据长度的方式来满足要求,这个过程就叫做填充padding。比如如下的数据:

数据:11111111 11111111 11111111
密钥:11111111 11111111

数据的第1,2字节可以作为一组来和密钥做异或运算,但是之后数据只剩下1个字节,所以就需要再额外的填充一个字节的数据。

填充的方式目前有两种,第一种是按照位填充,如下:
在这里插入图片描述
第二种是按照字节填充。因为按位填充的方式使用的不多,所以重点来看第二种按照字节方式填充。
按照字节填充的一种方式是直接补0,如下:
在这里插入图片描述
第二种方式是ANSI X9.23规范的,前面补0,最后一个字节为补零的个数,如下:
在这里插入图片描述
第三种方式是ISO 10126规范的,前面的字节补随机字符,最后一个字符为补的随机字符的个数,如下:
在这里插入图片描述
第四种方式是PKCS7 (RFC5652,每个字节都是填充的字节的个数,如下:
在这里插入图片描述

2.1.3:工作模式

我们已经知道,对称加密的原理是xor异或运算,但是异或运算需要将原有数据分成很多的段来依次进行,那么具体如何进行就是本部分要分析的工作模式了。通过工作模式可以完成对原有数据的异或运算,生成加密数据。
接着来看下都有哪些工作模式。

  • ECB模式
    直接将数据分成多块,依次加密。如下:
    在这里插入图片描述
    这种加密的方式的缺点是会保留大量原有数据的特征,更容易被破解。
    在这里插入图片描述
    为了解决这个容易被破解的问题,此时我们可以考虑ACB模式。
  • ACB模式
    这种模式的后一个异或操作需要依赖于前一个数据块异或的结果,如下图:
    在这里插入图片描述
    这种方式的问题是串行化,效率低。
  • CTR
    分块并行加密,如下:
    在这里插入图片描述
    缺点是无法进行消息的完整性校验。为了解决消息完整性校验,需要用到MAC(message authentication code),要用到hash函数来生成一个定长的hash值。主要过程是将消息和消息的哈希值都传到对端,对端同样对消息做哈希,对比收到的哈希,如果一致则消息完整,否则消息不完整(被篡改或丢失数据),如下图:
    在这里插入图片描述
    结合MAC完成消息完整性的校验,我们就有了最后一种工作模式。
  • GCM
    GCM=CTR+MAC,如下图:
    在这里插入图片描述

2.1.4:AES加密算法

TLS1.2,TLS1.3协议中使用的就是AES加密算法来对数据进行加密的,AES主要工作方式如下:

填充算法:PKCS7
分组模式:GCM,分组的长度是固定的16个字节

有了对称加密,数据的安全性就得到了保障,但是密钥要怎么传输到对端呢?这就需要用到非对称加密算法了。接着来看这部分内容。

2.2:非对称加密

在这里插入图片描述
非对称加密就是加密和解密的密钥不同,其中一般使用私钥加密,公钥解密,私钥自己保存,公钥对外暴漏。加解密过程参考下图:
在这里插入图片描述
非对称加密中最经典的加密算法是rsa算法,公钥私钥产生过程如下:
在这里插入图片描述
其实就是进行了一些复杂的数学运算得到一个结果,比如其中的p,q,n等都是计算过程中需要用到的参数。后续我们通过openssl实战密钥生成时也可以来具体的看到这些值。
加密解密过程如下:
在这里插入图片描述
相比于对称加密的异或运算,非对称加解密的数学运算更加复杂,所以就加解密速度来讲的话对称机密是更快的,所以,工作中如果没有特殊的需求建议使用对称机密,这样对系统性能的影响更小。

2.2.1:openssl实战rsa

为了验证rsa加密算法,也为了了解其加解密用到的各种参数值,有必要来来通过openssl具体看下。

  • 生成私钥
D:\test\ssl>openssl genrsa -out private.pemD:\test\ssl>type private.pem
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD1V1uc4WVV6Dp9
...
sNqRTYuws/DLlhAH4Ess9xw0FyquwoEkukgvsy/T8ndzcnXO7wX9RuaHHHL4t0DR
Mbwq/x1LymV0ZqYWFHtcTSNR
-----END PRIVATE KEY-----
  • 通过私钥导出公钥
    因为要解密,所以要用到加密时的某些参数值,而这些参数值需要通过私钥获取,所以需要通过私钥导出公钥:
D:\test\ssl>openssl rsa -in private.pem -pubout -out public.pem
writing RSA keyD:\test\ssl>type public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA9VdbnOFlVeg6fXdXjXmX
gCJtxcXU6k98oswyKxcrylZ7enTe/8EGLSaUpHD1psVQRBGUppWvFHdDO2ZzBacS
LCOKpZjUHNwJyxent6e97ZnPQwTMF8OtTq9OjXFirMppoAhpnVFJaF+IyCzYrtPU
bbtnwlf+l25kxce0FXkECg9I3sO0vIzs4Hglh5X+dwsXyLRoQ5zN+o35MYWPqyYQ
Z2hPpejStNZvXUGUPA64SsD39jCNQVlrKo9lnR1CToeZx32cBuAUZhVK6CGV9q6d
KjHzLvupIf6C0SmdUsihPpfKD8H3+WAqbXw7oFKpSd05o/yZOUyU3rifObnxUGEt
mwIDAQAB
-----END PUBLIC KEY-----
  • 查看 ASN.1 格式的私钥
D:\test\ssl>openssl asn1parse -i -in private.pem0:d=0  hl=4 l=1214 cons: SEQUENCE4:d=1  hl=2 l=   1 prim:  INTEGER           :007:d=1  hl=2 l=  13 cons:  SEQUENCE9:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption20:d=2  hl=2 l=   0 prim:   NULL22:d=1  hl=4 l=1192 prim:  OCTET STRING      [HEX DUMP]:308204A40201000282010100F5575B9CE16555E83A7D77578D799780226DC5C5D4EA4F7CA2CC322B172BCA567B7A74DEFFC1062D2694A470F5A6C550441194A695AF1477433B667305A7122C238AA598D41CDC09CB17A7B7A7BDED99CF4304CC17C3AD4EA...CEEF05FD46E6871C72F8B740D131BC2AFF1D4BCA657466A616147B5C4D2351 
  • 查看 ASN.1 格式的公钥
D:\test\ssl>openssl asn1parse -i -in public.pem0:d=0  hl=4 l= 290 cons: SEQUENCE4:d=1  hl=2 l=  13 cons:  SEQUENCE6:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption17:d=2  hl=2 l=   0 prim:   NULL19:d=1  hl=4 l= 271 prim:  BIT STRINGD:\test\ssl>openssl asn1parse -i -in public.pem -strparse 190:d=0  hl=4 l= 266 cons: SEQUENCE4:d=1  hl=4 l= 257 prim:  INTEGER           :F5575B9CE16555E83A7D77578D799780226DC5C5D4EA4F7CA2CC322B172BCA567B7A74DEFFC1062D2694A470F5A6C550441194A695AF1477433B667305A7122C238AA598D41CDC09CB17A7B7A7BDED99CF4304CC17C3AD4EAF4E8D7162ACCA69A008699D5149685F88C82CD8AED3D46DBB67C257FE976E64C5C7B41579040A0F48DEC3B4BC8CECE078258795FE770B17C8B468439CCDFA8DF931858FAB261067684FA5E8D2B4D66F5D41943C0EB84AC0F7F6308D41596B2A8F659D1D424E8799C77D9C06E01466154AE82195F6AE9D2A31F32EFBA921FE82D1299D52C8A13E97CA0FC1F7F9602A6D7C3BA052A949DD39A3FC99394C94DEB89F39B9F150612D9B265:d=1  hl=2 l=   3 prim:  INTEGER           :010001 

第二行就是n的值,第三行就是k的值。

  • 使用 RSA 公私钥加解密
    加解密的文件:
D:\test\ssl>type hello.txt
数据:11111111 11111111 11111111
密钥:11111111 11111111 

加密:

D:\test\ssl>openssl pkeyutl -encrypt -in hello.txt -inkey public.pem -pubin -out hello.enD:\test\ssl>type hello.en
߫�)2��U��=�

因为加密了所以是乱码。
解密:

D:\test\ssl>openssl pkeyutl -decrypt -in hello.en -inkey private.pem -out hello.deD:\test\ssl>cat hello.de
'cat' is not recognized as an internal or external command,
operable program or batch file.D:\test\ssl>type hello.de
数据:11111111 11111111 11111111
密钥:11111111 11111111

不管是对称加密,还是非对称加密,想要应用到我们的网站中,还是需要一套规范来进行定义其具体行为的,即要想落地只有加密本身还是不够的,所以就有了PKI(public key infrastructure),接下来就看下这部分的内容。

2.3:非对称加密的应用PKI

PKI全称是public key infrastructure,即公钥基础设施,规定了为了能够让网站安全运行需要的元素,具体有如下的这些元素:

CA:certificate authority,即数字证书认证机构,负责颁发数字证书(数字签名)
公钥数字证书的组成:CA信息,公钥用户信息,公钥,权威机构签字,证书有效期等
PKI用户:向CA注册的用户,即申请证书的用户希望使用已经注册的公钥的用户(如浏览器)

数字签名,或数字证书的核心是使用私钥加密,只能使用公钥解密,从而就起到了身份认证的作用。需要注意数字证书仅仅用来进行认证,并不会用来加密传输的数据,加密传输数据还需要依赖于对称机密算法。

这部分的知识很难用线性的方式来进行学习,所以我们通过核心知识点的方式来进行学习。

2.3.1:证书申请的流程

假定鲍勃有一个个人网站,想要申请证书,那么流程是这样子的。首先鲍勃需要准备个人以及网站的基础信息,并使用rsa算法生成公钥和私钥,其中私钥自己保存使用,公钥和基础信息需要提交给CA机构,CA机构负责验证基础信息的真实性,验证通过后,CA也会自己生成公钥和私钥,接着使用私钥对数据进行加密,从而生成数字证书。
在这里插入图片描述
具体生成数字证书的过程是这样子的:

1:对用户基础信息执行hash函数,获取一个哈希值
2:CA使用自己的私钥对哈希值进行加密
3:将加密结果和用户的公钥组合在一起,生成证书

如下图:
在这里插入图片描述
所以在一个数字证书中就包含如下的信息:

1:基础信息
2:网站的公钥
3:CA的公钥
4:证书有效期等
5:CA机构信息
6:使用的哈希函数

如:
在这里插入图片描述
那么当浏览器拿到了这个公钥数字证书之后,如何验签呢,过程是这样子的:

1:浏览器从公钥证书中解析出基础数据和CA的签名
2:浏览器对基础数据使用哈希函数对基础数据执行哈希,获取签名结果1
3:浏览器对CA加密的签名结果使用CA的公钥解密,获取签名结果2
4:比较签名结果1和签名结果2,一致则验签成功,否则不成功

图示:
在这里插入图片描述

2.3.2:证书信任链

因为证书的需求量是比较庞大的,所以一个CA机构是远远不够的,所以就需要一些子的CA机构,这些子的CA机构来负责制作和办法证书,这样就形成了一种链式的结构,叫做证书信任链,其中最高级的CA机构叫做ROOT CA,上层CA为下层CA背书,结构如下:
在这里插入图片描述
查看CSDN:
在这里插入图片描述

2.3.3:PKI公钥基础设施包含哪些部分

1:证书订阅人申请证书,如网站持有者
2:登记机构记录和验证证书订阅人的基础信息,我认为可以看作CA的一部分。
3:CA颁发公钥证书
4:web服务器部署公钥证书
5:信赖方如浏览器,或其他https的客户端程序
6:CRL服务器,OCSP服务器存储证书的元信息,如是否有效等

具体过程是这样子的:

1:证书订阅人将基础信息和公钥交给登记机构,登记机构记录和验证信息
2:登记机构验证通过后将信息交给CA,CA颁发证书给证书订阅人
3:证书订阅人将证书部署到web服务器中
4:信赖方访问web服务器,web服务器将证书返回给信赖方
5:信赖方通过CRL服务器,OCSP服务器验证证书的有效性

图示:
在这里插入图片描述

2.3.4:证书类型

我们已经知道了,证书订阅人需要将基础信息提交给CA后,CA会对这些基础信息的真实性做出验证,根据验证的方式不同,内容不同,就分出了不同的证书类型,分别是DV证书,domain validated,OV证书,organization validated,EV证书,extended validated证书。级别依次增高,如下图:
在这里插入图片描述
如百度就是OV证书:
在这里插入图片描述

写在后面

参考文章列表

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

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

相关文章

STM32 I2C通信外设

单片机学习! 目录 前言 一、I2C外设简介 1.1 硬件I2C外设 1.2 硬件I2C功能 1.2.1 多主机模型 1.2.2 7位地址和10位地址的模式 1.2.3 通讯速度 1.2.4 支持DMA 1.2.5 兼容SMBus协议 1.2.6 芯片型号资源 二、I2C框图 2.1 引脚 2.2 SDA数据控制 2.3 SCL时…

新型大数据架构之湖仓一体(Lakehouse)架构特性说明——Lakehouse 架构(一)

文章目录 为什么需要新的数据架构?湖仓一体(Lakehouse)——新的大数据架构模式 同时具备数仓与数据湖的优点湖仓一体架构 存储层计算层 湖仓一体特性 单一存储拥有数据仓库的查询性能存算分离开放式架构支持各种数据源类型支持各种使用方式架…

Linux安全防火墙(iptables)配置策略

目录 概念 防火墙的主要功能和特点: 防火墙分类 其他概念 通信五要素: 通信四要素 用户态和内核态 四个表五个链 四个表 五条链 数据包过滤的匹配流程 三种报文流向: 规则内的匹配顺序: iptables iptables命令的格…

十四、Vue 混入(Mixins)详解

文章目录 简介一、基本语法定义混入对象使用混入对象二、混入的数据合并数据合并规则深度合并(对象类型数据)三、混入的生命周期钩子生命周期钩子的合并规则利用生命周期钩子合并的优势四、混入的方法合并方法合并规则调用被覆盖的方法(高级用法)五、混入的应用场景多个组件…

每日AIGC最新进展(80): 重庆大学提出多角色视频生成方法、Adobe提出大视角变化下的人类视频生成、字节跳动提出快速虚拟头像生成方法

Diffusion Models专栏文章汇总:入门与实战 Follow-Your-MultiPose: Tuning-Free Multi-Character Text-to-Video Generation via Pose Guidance 在多角色视频生成的研究中,如何实现文本可编辑和姿态可控的角色生成一直是一个具有挑战性的课题。现有的方法往往只关注单一对象的…

【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】

目录😋 任务描述 相关知识 1. 纯虚函数 一、特点 二、使用场景 三、作用 四、注意事项 五、相关概念对比 2. 抽象类的使用 一、定义与概念 二、使用场景 编程要求 测试说明 通关代码 测试结果 任务描述 本关任务:设计一个矩形类、一个圆形…

STM32 拓展 电源控制

目录 电源控制 电源框图 VDDA供电区域 VDD供电区域 1.8V低电压区域 后备供电区域 电压调节器 上电复位和掉电复位 可编程电压检测器(PVD) 低功耗 睡眠模式(只有CUP(老板)睡眠) 进入睡眠模式 退出睡眠模式 停机(停止)模式(只留核心区域(上班)) 进入停…

c# CodeFirst生成表字段加注释

前置:ORM框架工具使用的FreeSql 背景:开发环境中运行接口,所有的表字段以及备注会自动加上,但是在测试环境时运行就只生成了表,没有把每个字段的注释加上 问题检查: FreeSql CodeFirst 支持将 c# 代码内的注…

Python连接和操作Elasticsearch详细指南

Python连接和操作Elasticsearch详细指南 一、服务器端配置1. 修改 Elasticsearch 配置文件2. 开放防火墙端口 二、本地 Python 连接 Elasticsearch1. 连接 Elasticsearch2. 索引操作3. 文档操作4. 搜索内容5. 聚合查询6. 批量操作 三、注意事项四、故障排除结论 Elasticsearch …

五个不同类型的数据库安装

一、 官方首页下载 打开 MySQL 官方首页,链接为: MySQL 进去社区后选择合适的版本进行安装 安装细节 依图一路next 点击finish结束安装 二、 在线YUM仓库 将该安装包的下载链接在 Linux 操作系统中按照以下命令直接进行下载 三、 二进制本地 通过该链接…

用户界面软件01

Jens Coldewey 著,Tom.X 译 本文中的模式语言逐步深入地探讨用户界面架构的设计,它基于人机工程学,足以形成一套完整的体系。如果你对这方面有兴趣,请参考[Tog92],[Coo95]和[Col95]。 本文不讨论用户界面的布局&…

Android 性能优化:内存优化(实践篇)

1. 前言 前一篇文章Android性能优化:内存优化 (思路篇) 大概梳理了Android 内存原理和优化的必要性及应该如何优化,输出了一套短期和长期内存优化治理的SOP方案。 那么这一篇文章就总结下我最近在做内存优化如何实践的&#xff0…

stm32第一次烧录或者上电运行卡死问题分析

问题描述 单片机烧录代码(刚上电)无法立即运行,必须要复位一次或多次才能运行;跟踪调试会进入HardFault_Handler中断。 问题分析 烧录配置如下图,首先排除配置问题那么该问题就比较让人头大了,理论上&am…

Unity中 Xlua使用整理(一)

1.安装: 从GitHub上下载Xlua源码 Tencent/xLua: xLua is a lua programming solution for C# ( Unity, .Net, Mono) , it supports android, ios, windows, linux, osx, etc. (github.com) 下载Xlua压缩包,并解压将Aseet文件夹中的Xlua和Plugins文件夹复制到Unit…

git理解记录

文章目录 1. 背景2. 基本概念3. 日常工作流程4. 其他常见操作4.1 merge合并操作4.2 tag打标签操作4.3 remoute远程操作4.4 撤销修改 git理解记录 1. 背景 git作为分布式版本控制系统,开源且免费,相比svn集中式版本控制系统存在速度快(HEAD指针指向某次co…

js复制数据到剪切板

方法一: 在下面方法传入你想要复制的字符 ,直接调用该方法就好 export function copyText(text: string) {if (navigator.clipboard) {// clipboard api 复制navigator.clipboard.writeText(text)} else {const textarea document.createElement(text…

服务器Ubuntu22.04系统下 ollama的详细部署安装和搭配open_webui使用

服务器Ubuntu22.04系统下 ollama的详细部署安装和搭配open_webui使用 一、ubuntu和docker基本环境配置1.更新包列表:2. 安装docker依赖3. 添加docker密钥4.添加阿里云docker软件源5.安装docker6.安装完成docker测试7. docker配置国内镜像源 二、安装英伟达显卡驱动1…

LInux单机安装Redis

1. 安装gee工具包 由于Redis是基于c语言编写的所以安装的时候需要先安装gee以及gcc的依赖,yum云用不了可以看一下这个 linux 替换yum源镜像_更换yum镜像源-CSDN博客 yum install -y gcc tcl 2. 添加redis的压缩包 3. 上传到Linux 上传到 /usr/local/src 目录、这个目录一般用于…

西门子200smart存储卡作用

最近维修设备时,遇到一个问题,设备PLC是200smart SR20,PLC程序需要修改某个程序段,由于手里没有源程序,联系厂家后,厂家发了一段程序,后缀是.s7s。通过查询官网资料,其中S7_JOB.S7S为脚本任务&a…

QT上实现SVM进行数据分类

针对不了解SVM的原理的同学强推下面这个课程: 6.机器学习课程(六)支持向量机(线性模型)问题_哔哩哔哩_bilibili 一、QT实现SVM的方法 1.调用SVM的C语言库:麻烦,要专门去找库,cmak…