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

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证书:
在这里插入图片描述

写在后面

参考文章列表

相关文章:

SSL,TLS协议分析

写在前面 工作中总是会接触到https协议,也知道其使用了ssl,tls协议。但对其细节并不是十分的清楚。所以,就希望通过这篇文章让自己和读者朋友们都能对这方面知识有更清晰的理解。 1:tls/ssl协议的工作原理 1.1:设计的…...

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…...

Redis的数据结构(基本)

安装完成后,在任意目录输入redis-server命令即可启动Redis: redis-server 我们可以进入redis命令行窗口 Redis安装完成后就自带了命令行客户端:redis-cli,使用方式如下: redis-cli [options] [commonds] 其中常见…...

分布式锁 Redis vs etcd

为什么要实现分布式锁?为什么需要分布式锁,分布式锁的作用是什么,哪些场景会使用到分布式锁?分布式锁的实现方式有哪些分布式锁的核心原理是什么 如何实现分布式锁redis(自旋锁版本)etcd 的分布式锁(互斥锁(信号控制)版本) 分布式锁对比redis vs etcd 总结 为什么要实现分布式…...

docker中jenkins流水线式部署GitLab中springboot项目

本质就是将java项目拉取下来,并自动打包成docker镜像,运行 首先启动一个docker的jenkins 如果没有镜像使用我的镜像 通过网盘分享的文件:jenkins.tar 链接: https://pan.baidu.com/s/1VJOMf6RSIQbvW_V1zFD7eQ?pwd6666 提取码: 6666 放入服…...

甘蔗叶片图像元素含量的回归预测多模型实现【含私人数据集】

完整源码项目包获取→点击文章末尾名片! 基于python的小样本学习,完成对甘蔗叶片图像元素含量的回归预测 数据集这边我提供,包含91个样本,共182个图像,要求全部数据集保密,不能对外公开或泄露;…...

uniapp:钉钉小程序需要录音权限及调用录音

{// ... 其他配置项"mp-dingtalk": {"permission": {"scope.userLocation" : {"desc" : "系统希望获得您的定位用于确认您周围的设施数据"},"scope.bluetooth" : {"desc" : "你的蓝牙权限将用于小…...

Qt仿音乐播放器:媒体类

一、铺垫 我暂时只会音频系列的操作&#xff0c;我只能演示音频部分&#xff1b;但是QMediaPlayer是一个可以播放视频、音频的类&#xff1b;请同学们细读官方文档&#xff1b; 二、头文件 #include<QMediaPlayer> 头文件 #include<QMediaPlaylist> 三、演…...

Flink-CDC 全面解析

Flink-CDC 全面解析 一、CDC 概述 &#xff08;一&#xff09;什么是 CDC CDC 即 Change Data Capture&#xff08;变更数据获取&#xff09;&#xff0c;其核心要义在于严密监测并精准捕获数据库内发生的各种变动情况&#xff0c;像数据的插入、更新以及删除操作&#xff0…...

HarmonyOS中实现上拉加载下拉刷新

参考网址&#xff1a;Refresh-滚动与滑动-ArkTS组件-ArkUI&#xff08;方舟UI框架&#xff09;-应用框架 - 华为HarmonyOS开发者 1.数据基类 //根据自己的业务数据扩展此类 //注意&#xff1a;一定要继承Object export class PullToRefreshBean extends Object{name: string …...

【轻松学C:编程小白的大冒险】--- C语言简介 02

在编程的艺术世界里&#xff0c;代码和灵感需要寻找到最佳的交融点&#xff0c;才能打造出令人为之惊叹的作品。而在这座秋知叶i博客的殿堂里&#xff0c;我们将共同追寻这种完美结合&#xff0c;为未来的世界留下属于我们的独特印记。 【轻松学C&#xff1a;编程小白的大冒险】…...

MySQL安装,配置教程

一、Linux在线yum仓库安装 打开MySQL官方首页&#xff0c;链接为&#xff1a;https://www.mysql.com/ 界面如下&#xff1a; 在该页面中找到【DOWNOADS】选项卡&#xff0c;点击进入下载页面。 在下载界面中&#xff0c;可以看到不同版本的下载链接&#xff0c;这里选择【My…...

项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

前言 在嵌入式设备的OTA场景测试和其他断电上电测试过程中&#xff0c;有的场景发生在夜晚或者随时可能发生&#xff0c;这个时候不可能24h人工盯着&#xff0c;需要自动化抓取串口日志处罚断电上电操作。 下面的python脚本可以实现自动抓取串口指定关键词&#xff0c;然后触发…...

多活架构的实现原理与应用场景解析

一、多活架构为何如此重要? 企业的业务运营与各类线上服务紧密相连,从日常的购物消费、社交娱乐,到金融交易、在线教育等关键领域,无一不依赖于稳定可靠的信息系统。多活架构的重要性愈发凸显,它宛如一位忠诚的卫士,为业务的平稳运行保驾护航。 回想那些因系统故障引发的…...

01-springclound

OpenFeign OpenFeign的日志级别 GateWay GateWay自定义过滤器 自定义过滤器&#xff0c;实现Order接口 数字小的先执行 GateWay传递用户信息 1、需要在网关搞定登录校验&#xff0c;将用户信息保存到请求头 2、网关到微服务 通过 springmvc的拦截器 来处理&#xff0c;将用户…...

Pandas-RFM会员价值度模型

文章目录 一. 会员价值度模型介绍二. RFM计算与显示1. 背景2. 技术点3. 数据4. 代码① 导入模块② 读取数据③ 数据预处理Ⅰ. 数据清洗, 即: 删除缺失值, 去掉异常值.Ⅱ. 查看清洗后的数据Ⅲ. 把前四年的数据, 拼接到一起 ④ 计算RFM的原始值⑤ 确定RFM划分区间⑥ RFM计算过程⑦…...

Java基础知识面试题

1.Java语言的特点&#xff1f; 1.一面向对象&#xff08;封装&#xff0c;继承&#xff0c;多态&#xff09;&#xff1b; 2.平台无关性&#xff08; Java 虚拟机实现平台无关性&#xff09;&#xff1b;(类是一种定义对象的蓝图或模板)3.支持多线程&#xff08; C 语言没有内…...

WebSocket监听接口

在Vue.js中使用WebSocket来监听接口其实相对简单。WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;通常用于需要实时数据更新的场景&#xff0c;比如聊天应用、实时通知等。 以下是一个在Vue.js中使用WebSocket的示例&#xff1a; 1. 创建Vue项目 如果你还…...

Kotlin语言的编程范式

Kotlin语言的编程范式 Kotlin是一种现代的编程语言&#xff0c;旨在提高开发效率&#xff0c;减少代码复杂度。在过去几年中&#xff0c;Kotlin在Android开发中获得了极大的普及&#xff0c;同时也逐渐被用在服务器端、Web开发、数据科学等多个领域。本文将深入探讨Kotlin的编…...

【权限管理】Apache Shiro学习教程

Apache Shiro 是一个功能强大且灵活的安全框架&#xff0c;主要用于身份认证&#xff08;Authentication&#xff09;、授权&#xff08;Authorization&#xff09;、会话管理&#xff08;Session Management&#xff09;和加密&#xff08;Cryptography&#xff09;。它旨在为…...

网络安全 信息收集入门

1.信息收集定义 信息收集是指收集有关目标应用程序和系统的相关信息。这些信息可以帮助攻击者了解目标系统的架构、技术实现细节、运行环境、网络拓扑结构、安全措施等方面的信息&#xff0c;以便我们在后续的渗透过程更好的进行。 2.收集方式-主动和被动收集 ①收集方式不同…...

Java Web开发进阶——RESTful API设计与开发

随着分布式系统和微服务架构的流行&#xff0c;RESTful API已成为现代Web应用中后端与前端、第三方系统交互的重要方式。本节将深入探讨RESTful API的设计原则、实现方式以及如何使用Spring Boot开发高效、可靠的RESTful服务。 1. 理解RESTful API的设计原则 1.1 什么是RESTfu…...

图片已经在windows上旋转了,但是在linux上仍然显示不正常

公司接了一个linux产品的售后工作&#xff0c;我们现在的产品都是android。linux设备如果要播放竖屏的图片在linux主板上。需要将图片旋转下才能正常播放。 我拿到图片以后&#xff0c;就用window图片编辑器打开了图片如下图左。选择逆时针选择了90 然后另存图片为如下图右。 …...

关于大数据的基础知识(二)——国内大数据产业链分布结构

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于大数据的基础知识&#xff08;二&a…...

Flutter鸿蒙化 在鸿蒙应用中添加Flutter页面

前言 今天这节课我们讲一下 在鸿蒙应用中添加Flutter页面。 作用: 之前有很多朋友和网友问我鸿蒙能不能使用Flutter开发,他们的项目已经用Flutter开发成熟了有什么好的方案呢,今天讲到这个就可以很好的解决他们的问题,例如我们正式项目中可能是一部分native 开发 一部分…...

【递归,搜索与回溯算法 综合练习】深入理解暴搜决策树:递归,搜索与回溯算法综合小专题(二)

优美的排列 题目解析 算法原理 解法 &#xff1a;暴搜 决策树 红色剪枝&#xff1a;用于剪去该节点的值在对应分支中&#xff0c;已经被使用的情况&#xff0c;可以定义一个 check[ ] 紫色剪枝&#xff1a;perm[i] 不能够被 i 整除&#xff0c;i 不能够被 per…...

Perl语言的语法

Perl语言概述及其应用 引言 Perl语言是一种通用的高级编程语言&#xff0c;由拉里沃尔&#xff08;Larry Wall&#xff09;于1987年首次发布。Perl语言的设计目标是简化文本处理和报告生成&#xff0c;同时也提供了强大的功能以用于系统管理、网络编程、数据库交互等多种场景…...

ELK+filebeat+kafka

ELKfilebeatkafka elkelk的架构数据流向ELK的部署 filebeatzookeeperkafkazopkeeprzookeeper的工作机制zookeeper的特点zookeeper的数据架构zookeeper的安装 kafka消息队列消息队列的应用场景消息队列的模式kafka组件的名称 elk elk的架构 elk&#xff1a;统一日志收集系统 …...

WPF系列九:图形控件EllipseGeometry

简介 EllipseGeometry用于绘制一个椭圆的形状。它通常与其他图形元素结合使用&#xff0c;比如 Path 或者作为剪切区域来定义其他元素的外形。 定义椭圆&#xff1a;EllipseGeometry 用来定义一个椭圆或者圆的几何形状。参与绘制&#xff1a;可以被用作 Path 元素的数据&…...

2025新年源码免费送

2025很开门很开门的源码免费传递。不需要馒头就能获取4套大开门源码。 听泉偷宝&#xff0c;又进来偷我源码啦&#x1f44a;&#x1f44a;&#x1f44a;。欢迎偷源码 &#x1f525;&#x1f525;&#x1f525; 获取免费源码以及更多源码&#xff0c;可以私信联系我 我们常常…...

离线录制激光雷达数据进行建图

目前有一个2D激光雷达&#xff0c;自己控制小车运行一段时间&#xff0c;离线获取到激光雷达数据后运行如下代码进行离线建图。 roslaunch cartographer_ros demo_revo_lds.launch bag_filename:/home/firefly/AutoCar/data/rplidar_s2/2025-01-08-02-08-33.bag实际效果如下 d…...

Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)

章节3基础功能搭建 46.函数作为值三 package cn . itbaizhan . chapter03 // 函数作为值&#xff0c;函数也是个对象 object FunctionToTypeValue { def main ( args : Array [ String ]): Unit { //Student stu new Student() /*val a ()>{"GTJin"…...

AI中的神经元与权重矩阵之间的关系;神经元连接角度看行和列的意义

AI中的神经元与权重矩阵之间的关系 目录 AI中的神经元与权重矩阵之间的关系神经元连接角度看行和列的意义AI中的神经元概念 在人工智能领域,特别是神经网络中,神经元是基本的计算单元,它是对生物神经元的一种抽象模拟。就像生物神经元接收来自其他神经元的电信号,经过处理后…...

前端中常用的单位度量(px,rpx,rem,em,vw,vh)+图片自适应

文章目录 前端中常用的单位度量vw/vh 的场景应用px/rem/em 之间的转换关系项目中的rem 应用根元素 font-size 设置为16px 的应用惯例自适应之图片应用1. 使用 max-width 和 max-height2. 使用 object-fit 属性3. 使用 background-image 模拟图片展示 前端中常用的单位度量 px&…...

Attention计算中的各个矩阵的维度都是如何一步步变化的?

在Transformer模型中&#xff0c;各个矩阵的维度变化是一个关键的过程&#xff0c;涉及到输入、编码器、解码器和输出等多个阶段。以下是详细的维度变化过程&#xff1a; 输入阶段 输入序列&#xff1a;假设输入序列的长度为seq_len&#xff0c;每个单词或标记通过词嵌入&…...

Golang学习笔记_23——error补充

Golang学习笔记_20——error Golang学习笔记_21——Reader Golang学习笔记_22——Reader示例 文章目录 error补充1. 基本错误处理2. 自定义错误3. 错误类型判断3.1 类型断言3.2 类型选择 4. panic && recover 源码 error补充 1. 基本错误处理 在Go中&#xff0c;函数…...

DB-Engines Ranking 2025年1月数据库排行

DB-Engines Ranking 2025年1月数据库排行 DB-Engines排名根据数据库管理系统的受欢迎程度进行排名。排名每月更新一次。 2025年1月&#xff0c;共有423个数据库进入排行。 排行榜 Oracle Oracle 连续三月稳居榜首&#xff0c;排名稳定。2025 年 1 月分数较上月增 5.03&#x…...

积分与签到设计

积分 在交互系统中&#xff0c;可以通过看视频、发评论、点赞、签到等操作获取积分&#xff0c;获取的积分又可以参与排行榜、兑换优惠券等&#xff0c;提高用户使用系统的积极性&#xff0c;实现引流。这些功能在很多项目中都很常见&#xff0c;关于功能的实现我的思路如下。 …...

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…...

用 HTML5 Canvas 和 JavaScript 实现炫酷跨年烟花特效

一、引言 跨年夜,五彩斑斓、绚丽绽放的烟花是最令人期待的视觉盛宴之一。在网页端,我们能否通过技术手段复现这一梦幻场景呢?答案是肯定的。本文将深入剖析一段使用 HTML5 Canvas 和 JavaScript 实现的跨年烟花特效源码,带你领略前端技术创造的惊艳画面。 用 HTML5 Canvas…...

什么是数据湖?大数据架构的未来趋势

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…...

Spring boot接入xxl-job

Spring boot接入xxl-job 导入maven包加入配置增加配置类创建执行器类&#xff08;写job的业务逻辑&#xff09;去控制台中配置job 导入maven包 <dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>…...

Flutter pubspec.yaml 使用方式

Flutter pubspec.yaml 使用方式 pubspec.yaml 是 Flutter 项目中最重要的配置文件之一&#xff0c;用于管理应用的基本信息、依赖项、资源以及构建配置等内容。 1. 基本结构和字段 基本信息 name: my_flutter_app # 应用的名称 description: A new Flutter project …...

Elixir语言的学习路线

Elixir语言的学习路线 Elixir是一种动态、通用的编程语言&#xff0c;特别适合用于构建可扩展和维护性强的应用程序。它基于Erlang虚拟机&#xff08;BEAM&#xff09;&#xff0c;因其高并发性和容错能力而广受欢迎。近年来&#xff0c;Elixir在Web开发&#xff08;特别是与P…...

看不懂scatter、gather的来

1.torch.scatter 这是out-of-place版本&#xff08;相对于in-place版本&#xff09;&#xff0c;它会返回一个新的张量。 torch.Tensor.scatter_ 就是in-place版本&#xff0c;它直接修改自身&#xff0c;返回的也是自身 Tensor.scatter_(dim, index, src, *, reduceNone) →…...

系统思考—问题分析

爱因斯坦说过&#xff1a;“如果我有1小时拯救世界&#xff0c;我会花55分钟去确认问题为何&#xff0c;只用5分钟寻找解决方案。” 这个看似简单的道理&#xff0c;却蕴藏着解决复杂问题的智慧。真正的问题&#xff0c;往往隐藏在现象的背后。解决问题的关键&#xff0c;不在…...

【C】编译与链接

在本文章里面&#xff0c;我们讲会讲解C语言程序是如何从我们写的代码一步步变成计算机可以执行的二进制指令&#xff0c;并最终执行的。C语言程序运行主要包括两大步骤 -- 编译和链接&#xff0c;接下来我们就来一一讲解。 目录 1 翻译环境和运行环境 2 翻译环境 1&#…...

如何用Python编程实现自动整理XML发票文件

传统手工整理发票耗时费力且易出错&#xff0c;而 XML 格式发票因其结构化、标准化的特点&#xff0c;为实现发票的自动化整理与保存提供了可能。本文将详细探讨用python来编程实现对 XML 格式的发票进行自动整理。 一、XML 格式发票的特点 结构化数据&#xff1a;XML 格式发票…...

深入探索OceanBase分布式数据库理论:开启数据管理新篇章

《深入探索OceanBase分布式数据库理论&#xff1a;开启数据管理新篇章》 在当今数字化转型风起云涌的时代&#xff0c;数据已然成为企业最为宝贵的资产之一。随着数据量呈爆炸式增长、业务场景愈发复杂多元&#xff0c;传统的集中式数据库在应对高并发、海量数据存储与处理时逐…...

如何用VS调试不属于解决方案的EXE和DLL程序-使用PDB和EXE文件-根据exe|pdb|源码文件进行调试分析

文章目录 1.问题2.基本点3.方法步骤3.1.新建一个空的解决方案3.2.构建源码项目3.3.添加pdb文件目录3.4.调试目标exe 4.源码断点 1.问题 如果你手里有一个现成的EXE, 以及EXE相关联PDB文件, 还有相关联的CPP文件和H文件. 你如何用VS调试? (当然你可以选择WinDbg.不过这里就讨论…...