TLS协议深度解析:挖掘现代网络安全防御的底层技术
正常简单的通讯
1、服务器生成一对密钥,公钥A、私钥A
2、浏览器请求服务器时,服务器把公钥A传给浏览器
3、浏览器随机生成一个对称加密的密码S,用公钥A加密后传给服务器
4、服务器接收后,用私钥A解密,得到密钥S
5、浏览器和服务器都知道密钥S,就可以使用密钥S加密数据然后传输
这样看起来可以通讯,但是是有漏洞的。
中间人攻击
1、服务器生成一对密钥,公钥A、私钥A。
2、浏览器请求服务器时,服务器准备把公钥A传给浏览器;此时中间人X,生成也生成一对密钥,公钥B、私钥B,X劫持到公钥A后替换成自己的公钥B,发给浏览器。
3、浏览器无法分辨公钥B是否是服务器的,生成一个对称加密密钥S,公钥B加密后准备传给服务器,其实传给了中间人X。
4、中间人收到后,使用私钥B解密拿到密钥S,然后再使用公钥A加密传给服务器
5、服务器收到后使用私钥A解密也拿到密钥S。
6、浏览器和服务器使用密钥S加密后传输数据,此时中间人X也是持有密钥S,劫持到数据包后使用密钥S就能解密。
这种情况,服务器和客户端都不会发现异常,因为客户端无法确认收到的公钥是不是服务器的。因为公钥是明文形式传播的。如何证明公钥是服务器的,就出现CA机构?
CA机构
CA机构相当于现实中的“派出所”,数字证书就相当于“身份证”。
数字证书
网站在使用HTTPS之前,需要向CA机构申领一份数字证书,数字证书包含服务器的信息(包含版本号、序列号、签名算法、颁发者、网站服务器公钥(RSA签名公钥)等信息)
数字签名
**证书会被修改吗?**证书中会包含一段私钥加密的签名,是将证书的内容进行HASH得出。如果证书被篡改,签名会对不上。这个签名就是数字签名,用来防伪的技术。
证书生成
a、CA机构有非对称加密的私钥和公钥,(私钥保存在CA服务器上,公钥(其实是CA机构证书链上的根证书的公钥)预装在各个操作系统、电脑上、Android等)
b、CA机构对证书数据X进行HASH(证书数据包括版本号、序列号、HASH签名算法、颁发者、服务器的公钥等)
c、用CA的私钥对HASH值H进行加密,得到数字签名S,并添加到证书上就是数字证书。
证书验证
a、浏览器拿到证书后,通过证书链验证颁发者是否可信,然后得到数据T,以及签名S
b、用预装的CA机构证书链上的根证书的公钥对S进行解密,得到H
c、使用证书里的HASH签名算法,对数据T进行HASH得到H1,此时H1应该等于H,说明未被篡改
质疑思考
a、**证书会被掉包吗?**证书里包含了网站的信息(包括域名等),证书如果被替换,浏览器能知道访问的网站和证书是否一致
b、**为什么数字签名要HASH一次?**证书信息一般比较长(**为什么不能只用非对称加密?**非对称加密算法可以加密的数据长度有上限,否则会报错或者需要分割加密效率极低),使用HASH算法得到证书信息的摘要,将数据变短能提高加密和传输的效率,也能更安全
c、怎么确保CA的公钥时可信的?各个操作系统、电脑上、Android设备上会预装一些CA机构的根证书,根证书中包含公钥,验证的时候通过证书链,以根证书为起点,层层信任。
d、**TLS每次都会传递密钥吗?**服务器会给每个客户端维护一个Session ID,将密钥存到对应的Session ID下,客户端请求的是时候携带Session ID(表示恢复之前的会话,如果Session ID为空时,表示不用恢复客户端和服务器重新协商密钥),服务器就会使用对应的密钥进行加密,不需要重新协商密钥。
TLS协议
TLS协议的作用
1、认证用户和服务器,确保数据发送到正确的客户机和服务器;
2、加密数据以防止数据中途被窃取;
3、维护数据的完整性,确保数据在传输过程中不被改变。
分为两层:记录层和握手层
上层-握手层包含4个协议
**握手协议 **进行身份认证、协商共享密钥
**更改密码规范协议 **根据握手协议协商的结果,切换加密密码套件
**应用数据协议 **通信双发进行数据传输的协议
**警告协议 **当以上过程发生错误时通知对方
下层-记录层
记录层协议
**添加消息头 **给数据添加消息头后封装交给TCP层
**分片重组 **发送方将数据分割成小的数据块,接收方可以将小数据块重组
**数据压缩解压缩 **对数据进行压缩和解压缩
**加密解密 **对数据进行加解密和解密
完整的握手过程
第一次握手:客户端发送
Client Hello 客户端Hello包
**Version **客户端支持的最高版本号
**Random **客户端随机数,每次握手都会重新生成(可以防止重放攻击),用于后续生成密钥
**Session ID **会话ID用于恢复会话,第一次是空表示不恢复会话,在后续的连接中,服务器可以借
助会话ID在自己的缓存中找到对应的会状态,这样只需1RTT既可以完成握手,完整
的握手协议2RTT(2次网络往返)才能完成握手
**Cipher Suites **客户端支持的所有密码套件,按优先级排列
**Compression Methods **压缩方法
**Extension **扩展数据
16进制数据分析
# 16 03 03 00 be 01 00 00 ba 03 03 64 c4 d9 0a 37 40 a3 af d6 27 66 d1 bb 29 d0 53 c8 e0 dc 14 16 06 cf d1 1a 40 eb c0 d3 67 48 57 00 00 26 c0 2c c0 2b c0 30 c0 2f c0 24 c0 23 c0 28 c0 27 c0 0a c0 09 c0 14 c0 13 00 9d 00 9c 00 3d 00 3c 00 35 00 2f 00 0a 01 00 00 6b 00 00 00 0f 00 0d 00 00 0a 68 61 6f 2e 71 71 2e 63 6f 6d 00 05 00 05 01 00 00 00 00 00 0a 00 08 00 06 00 1d 00 17 00 18 00 0b 00 02 01 00 00 0d 00 1a 00 18 08 04 08 05 08 06 04 01 05 01 02 01 04 03 05 03 02 03 02 02 06 01 06 03 00 23 00 00 00 10 00 0e 00 0c 02 68 32 08 68 74 74 70 2f 31 2e 31 00 17 00 00 ff 01 00 01 00 16 03 03 00 be
Record Header 记录头
16 握手类型 0x16
03 03 协议版本为3.3(也称为TLS 1.2)
00 be 接下来是190字节的握手消息01 00 00 ba
Handshake Header 握手头
01 握手消息类型(客户端hello)
00 00 ba 接下来是186字节的客户端hello数据03 03
Client Version 客户端协议版本为3.3,也称为TLS 1.264 c4 d9 0a 37 40 a3 af d6 27 66 d1 bb 29 d0 53 c8 e0 dc 14 16 06 cf d1 1a 40 eb c0 d3 67 48 57
Client Random 32位客户端随机数00
Session ID 会话ID,长度为0表示没有会话ID00 26 c0 2c c0 2b c0 30 c0 2f c0 24 c0 23 c0 28 c0 27 c0 0a c0 09 c0 14 c0 13 00 9d 00 9c 00 3d 00 3c 00 35 00 2f 00 0a
Cipher Suites 密码套件
00 26 38字节的密码套件数据
c0 2c Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (0xc02c)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (0xc02b)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (0xc030)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (0xc024)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (0xc023)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (0xc028)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (0xc027)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (0xc00a)Cipher Suite: TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (0xc009)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (0xc014)Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (0xc013)Cipher Suite: TLS_RSA_WITH_AES_256_GCM_SHA384 (0x009d)Cipher Suite: TLS_RSA_WITH_AES_128_GCM_SHA256 (0x009c)Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA256 (0x003d)Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA256 (0x003c)Cipher Suite: TLS_RSA_WITH_AES_256_CBC_SHA (0x0035)Cipher Suite: TLS_RSA_WITH_AES_128_CBC_SHA (0x002f)Cipher Suite: TLS_RSA_WITH_3DES_EDE_CBC_SHA (0x000a)01 00
Compression Methods 压缩方法
01 1字节的压缩方法如下
00 0表示没有压缩00 6b
Extensions Length 扩展数据长度为107字节00 00 00 0f 00 0d 00 00 0a 68 61 6f 2e 71 71 2e 63 6f 6d 00 05 00 05 01 00 00 00 00 00 0a 00 08 00 06 00 1d 00 17 00 18 00 0b 00 02 01 00 00 0d 00 1a 00 18 08 04 08 05 08 06 04 01 05 01 02 01 04 03 05 03 02 03 02 02 06 01 06 03 00 23 00 00 00 10 00 0e 00 0c 02 68 32 08 68 74 74 70 2f 31 2e 31 00 17 00 00 ff 01 00 01 00
Extension 扩展数据
第二次握手:服务器发送
Server Hello 服务器Hello包
**Version **服务器端的版本号
Random 服务器端的随机数,用于生成密钥
Cipher Suite 服务器从浏览器密码套件中选择一个回复
**Compression Methods **压缩方法
**Extension **扩展数据
注意:
密码套件结构:密钥交换算法 + 签名算法 + 对称加密算法 + 摘要算法
_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 _
ECDHE 密钥交换算法(短暂-椭圆曲线-迪菲-赫尔曼)
RSA 签名算法,证书里的公钥用的是RSA算法,用于身份验证
AES_128_GCM 对称加密,数据加密,分组模式是 GCM
SHA256 数据摘要算法,用于证书的签名和验签
TLS_RSA_WITH_AES_128_GCM_SHA256 表示密钥交换算法和签名算法都是RSA
16 03 03 00 54
Record Header 记录头
16 握手类型 0x16
03 03 协议版本为3.3(也称为TLS 1.2)
00 54 接下来是84字节的握手消息02 00 00 50
Handshake Header 握手头
01 握手消息类型(服务器hello)
00 00 50 接下来是80字节的服务器hello数据03 03
Server Version 服务器协议版本为3.3,也称为TLS 1.254 49 db a3 2d d9 b1 6e d3 0d 05 4a c8 56 a1 1d 94 9b 2a f3 3c 75 e4 a9 a9 da e2 50 22 c8 7d 04
Server Random 服务器随机数00
Session ID 会话IDc0 2f
Cipher Suite 加密套件
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)00
Compression Method 压缩方法00表示不压缩00 28
Extensions Length 接下来扩展数据长度为40字节ff 01 00 01 00 00 00 00 00 00 0b 00 04 03 00 01 02 00 23 00 00 00 10 00 0b 00 09 08 68 74 74 70 2f 31 2e 31 00 17 00 00
Extension
Certificate 服务器的证书信息
包含X.509证书链,主证书第一个,之后是中间证书、根证书
证书包含:版本号、序列号、签名算法、颁发者、网站服务器公钥(RSA签名公钥)
用CA的私钥加密的证书的摘要信息,即证书签名
16 03 03 0b a8
Record Header
16 握手类型 0x16
03 03 协议版本为3.3(也称为TLS 1.2)
0b a8 接下来是2984字节的握手消息0b 00 0b a4
Handshake Header
0b 握手消息类型(服务器certificate)
00 0b a4 接下来是2980字节的服务器certificate数据00 0b a1
Certificates Length 证书链的长度为 2977字节00 06 8f
Certificate Length 第一个证书的长度为 1679字节30 82 06 8b 30 82 05 73 a0 ......
Certificate 证书内容00 05 0c
Certificate Length 第二个证书的长度为129230 82 06 8b 30 82 05 73 a0 ......
Certificate 证书内容
Server Key Exchange 密钥交换
**Curve Type **曲线类型
**Named Curve **曲线名称,选择x25519,即确定好椭圆曲线基点G
G确定好之后,服务器会生成一个随机数做为x25519的私钥Server PrivKey,保存在本地不公开,再根据G和Server PrivKey计算出椭圆曲线的公钥Server Pubkey(公钥/私钥都是临时的,只在本次会话中使用,图中的Pubkey)传送给客户端
为确保Pubkey不被中间人篡改,服务端会用RSA签名算法给Pubkey做个签名,RSA私钥保存再服务器,RSA公钥已经放在证书中传给客户端(签名算法是私钥签名,公钥验签)。
Server Hello Done 服务器所有握手信息都发送完毕
第三次握手:客户端发送
第三次握手之前,客户端会先验证服务器的证书
1、证书链是否可信
2、证书是否吊销
3、证书是否在有效期内
4、证书中的域名是否是当前要访问的域名
证书链的验证过程:
一般情况下,服务器向CA申请的证书不是根证书,而是中间证书签发的,所以客户端其实是拿到了一个证书链,百度的证书层次结构有三级:
1、客户端收到百度的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证百度证书是否可信。于是,客户端根据百度证书中的签发者,找到该证书的颁发机构是GlobalSign RSA OV SSL CA 2018,然后向 CA 请求该中间证书。
2、请求到证书后发现GlobalSign RSA OV SSL CA 2018证书是由GlobalSign签发的,由于GlobalSign它是根证书,也就是自签证书。应用软件会检查系统中有没有预装CA根证书,如果有则可以利用根证书中的公钥去验证 GlobalSign RSA OV SSL CA 2018 证书,如果发现验证通过,就认为该中间证书是可信的。
3、GlobalSign RSA OV SSL CA 2018 证书被信任后,可以使用 GlobalSign RSA OV SSL CA 2018证书中的公钥去验证baidu.com证书的可信性,如果验证通过,就可以信任baidu.com证书
其实客户端最开始只信任根证书GlobalSign的证书,然后GlobalSign信任GlobalSign RSA OV SSL CA 2018,最后GlobalSign RSA OV SSL CA 2018又信任baidu.com证书,最终客户端也信任baidu.com证书
4、baidu.com证书可信后,客户端会得到RSA的公钥,并对服务端的Pubkey进行签名验证。
操作系统中保存的根证书
Client Key Exchange 客户端生成的椭圆曲线公钥发给服务器
证书验证通过后,客户端会根据服务器给的椭圆曲线算法生成一对自己的临时密钥Client PrivKey和 Client PubKey,并将Client PubKey用证书中的RSA公钥进行加密后发给服务器,就是图中的Pubkey
完成后客户端和服务端共享信息:Client Random、Server Random、椭圆曲线类型和名称、基点G、服务器椭圆曲线的公钥、客户端的椭圆曲线公钥。
此时客户端就可以计算会话密钥,会话密钥是基于对称加密的,会话密钥取决于主密钥,而组成主密钥的关键参数市预主密钥,密钥交换就是交换双方的预主密钥
1、客户端临时私钥、服务端临时公钥、以及椭圆曲线算法,计算出预主密钥(premaster secret),服务器也可以算出相同的预主密钥
pre_master_secret = ClientPrivKey * ServerPubKey
2、客户端随机数、服务端随机数、预主密钥,计算出主密钥(master secret)
PRF伪随机函数函数
master_secret = PRF(pre_master_secret, “master secret”, ClientHello.random + ServerHello.random)
3、客户端随机数、服务端随机数、主密钥 计算出最终的会话密钥,包含对称加密密钥,消息认证码密钥、初始化向量。
key_block = PRF(master_secret, “key expansion”, server_random + client_random)
因为 TLS 设计者不信任客户端或服务器「伪随机数」的可靠性,为了保证真正的完全随机,把三个不可靠的随机数混合起来,那么「随机」的程度就非常高了,足够让黑客计算出最终的会话密钥,安全性更高。
Change Cipher Spec 消息表示客户端已生成加密密钥,并切换到加密模式(密钥规格变更协议)
Encrypted Handshake Message 消息发送到服务器进行校验,这个对称加密密钥是否成功
客户端将之前所有的握手数据做一个HASH,再用最后协商好的对称加密算法对数据做加密。发送到服务器进行验证。
第四次握手:服务器发送
服务器在收到客户端Client Key Exchange消息后,这时可以拿到 Client Random、Server Random、客户端临时公钥Client PubKey,先计算出预主密钥(ClientPubKey * ServerPrivKey),再分别计算出主密钥和最终的会话密钥,这块可参考客户端计算密钥一样的。
New Session Ticket 服务器给客户端的Session ID,用于恢复会话
Change Cipher Spec 告诉客户端,服务端已生成密钥,请求客户端切换加密模式。
Encrypted Handshake Message 服务器对握手的所有数据用协商好的对称加密算法加密,供客户端校验。
此时整个握手完毕,已经建立一个安全的通信隧道,可以传输数据。
双方发送应用数据协议
整个握手过程完毕之后,我们会看到应用数据协议 “Application Data Protocol: http-over-tls”,之后我们的客户端/服务端建立一个安全通信隧道,就可以发送应用程序数据了。
在 RSA 握手中密钥交换:
1、客户端向服务器发送一条明文 “hello” 消息,其中包括他们要使用的协议版本、受支持的密码套件列表和称为“客户端随机数”的随机数据短字符串。
2、服务器使用其证书、首选密码套件和一个不同的随机数据短字符串(称为“服务器随机数”)响应(以明文格式)。
3、客户端验证证书,创建另一组随机数据46字节,称为“预主密钥(premaster secret)”。客户端从服务器的证书中获取公钥,加密预主密钥,并将其发送到服务器;只有拥有私钥的人员才能解密预主密钥。
4、该服务器解密“预主密钥”。注意,这是唯一一次使用私钥!
5、客户端和服务器都有客户端随机数、服务器随机数和预主密钥。根据这三个数计算得到主密钥,再通过主密钥计算得到会话密钥,会话密钥市对称的,会话期间的所有后续通信都用这些新会话密钥进行加密。
前向安全性问题:
RSA密钥交换的简单性也是它最大的弱点。用于加密预主密钥的服务器公钥,一般会保持多年不变。任何能够接触到对应私钥的人都可以恢复预主密钥,并构建相同的主密钥,从而危害到会话安全性。
对目标的攻击并不需要实时进行,强大的对手可以制定长期行动。攻击者会记录所有加密的流量,耐心等待有朝一日可以得到密钥。比如,计算机能力的进步使暴力破解成为可能;也可以通过法律强制力、政治高压、贿赂或强行进入使用该密钥的服务器来取得密钥。只要密钥泄露,就可以解密之前记录的所有流量了。
TLS中其他常见的密钥交换方式都不受这个问题的影响,被称为支持前向保密。使用那些密钥交换时,每个连接使用的主密钥相互独立。泄露的服务器密钥可以用于冒充服务器,但不能用于追溯解密任何流量。
为什么HTTPS的包可以被抓到?
首先抓包之前,fiddler会提示安装自己的根证书到操作系统(我们主动把它添加到了受信任的根证书颁发机构,所以我们计算机是认可这个证书的)
1、fiddler截获客户端发送的HTTPS,然后伪装成客户端向服务器发送请求
2、服务器返回数据,fiddler截获服务器的CA证书,用跟证书的公钥进行解密,验证服务器数字签名,获取服务器CA证书的公钥,然后fiddler伪造自己的CA证书,冒充服务器证书发给客户端,此时Fiddler就是中间人,可以截获客户端和服务器之间的数据。
3、Fiddler的根证书是能抓包的关键,这也是Fiddler伪造的CA证书能够获得客户端和服务器端信任的。
相关文章:
TLS协议深度解析:挖掘现代网络安全防御的底层技术
正常简单的通讯 1、服务器生成一对密钥,公钥A、私钥A 2、浏览器请求服务器时,服务器把公钥A传给浏览器 3、浏览器随机生成一个对称加密的密码S,用公钥A加密后传给服务器 4、服务器接收后,用私钥A解密,得到密钥S 5、浏…...
python的time各种用法
1、time Python的time模块提供了许多用于处理时间的功能。以下是一些常用的time模块的函数及其用法,并附有示例: time():返回当前时间的时间戳(自1970年1月1日00:00:00起的秒数)。 import timecurrent_time time.t…...
Vue中使用vue-router
Vue中使用vue-router 1. 安装vue-router2. 创建路由页面3. 创建router文件4. 挂载router5. 使用 1. 安装vue-router npm install vue-router3.6.5 --save2. 创建路由页面 HomeView.vue <template><div>home</div> </template><script>export …...
uni-app之android原生插件开发
一 插件简介 1.1 当HBuilderX中提供的能力无法满足App功能需求,需要通过使用Andorid/iOS原生开发实现时,可使用App离线SDK开发原生插件来扩展原生能力。 1.2 插件类型有两种,Module模式和Component模式 Module模式:能力扩展&…...
javaee spring aop实现事务 项目结构
spring配置文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframewo…...
9.9校招 实习 内推 面经
绿泡*泡: neituijunsir 交流裙 ,内推/实习/校招汇总表格 1、自动驾驶一周资讯 -理想汽车计划进军自动驾驶卡车领域,宝马联合亚马逊开发下一代自动驾驶平台,丰田汽车重组自动驾驶和人工智能子公司 自动驾驶一周资讯 -理想汽车…...
互联网医院App开发:构建医疗服务的技术指南
互联网医院App的开发是一个复杂而具有挑战性的任务,但它也是一个充满潜力的领域,可以为患者和医疗专业人员提供更便捷的医疗服务。本文将引导您通过一些常见的技术步骤来构建一个简单的互联网医院App原型,以了解该过程的基本概念。 技术栈选…...
阅读分享--重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文
重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文 https://zhuanlan.zhihu.com/p/52169807 废话不多说,下面就跟大家分享一下两次拜读这篇论文的不同体验和收获。 第一遍读这篇论文的时候,我想所有人都是冲着算法的架构去的,在深度学习推荐系统已经成为各大公司“基本…...
使用Python操作CSV文件,方便又快捷
概念 CSV是逗号分隔值或者字符分割值,其文件以纯文本形式存储表格数据。 CSV文件可以用文本文件或者转换成EXCEL(直接用EXCEL也可以,但是可能会有一些问题)打开。因此更适合通过CSV文件进行程序之间转移表格数据。 应用场景 需…...
深入探索KVM虚拟化技术:全面掌握虚拟机的创建与管理
文章目录 安装KVM开启cpu虚拟化安装KVM检查环境是否正常 KVM图形化创建虚拟机上传ISO创建虚拟机加载镜像配置内存添加磁盘能否手工指定存储路径呢?创建成功安装完成查看虚拟机 KVM命令行创建虚拟机创建磁盘通过命令行创建虚拟机手动安装虚拟机 KVM命令行创建虚拟机-…...
javaee springMVC model的使用
项目结构图 pom依赖 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org…...
Spring与Docker:如何容器化你的Spring应用
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
试图替代 Python 的下一代AI编程语言:Mojo
文章目录 为什么叫 Mojo ?Python 家族的一员,MojoPython 的好处:Python 兼容性Python 的问题移动和服务器部署:Python 子集和其他类似 Python 的语言: Mojo 是一种创新的编程语言,结合了 Python 的可用性和…...
【数据结构】栈、队列和数组
栈、队列和数组 栈队列数组数组的顺序表示和实现顺序表中查找和修改数组元素 矩阵的压缩存储特殊矩阵稀疏矩阵 栈 初始化 #define MaxSize 50//栈中元素的最大个数 typedef char ElemType;//数据结构 typedef struct{int top;//栈顶指针ElemType data[MaxSize];//存放栈中的元…...
python算法调用方案
1、python算法部署方案 (1)独立部署 算法端和应用端各自独立部署。 使用WSGI(flask)web应用A包装算法,并发布该应用A。 应用端B 通过httpclient调用算法应用A中的api接口。 (2)统一部署 算法…...
《微服务架构设计模式》第二章
文章目录 微服务架构是什么软件架构是什么软件架构的定义软件架构的41视图模型为什么架构如此重要 什么是架构风格分层式架构风格六边形架构风格微服务架构风格什么是服务什么是松耦合共享类库的角色 为应用程序定义微服务架构识别操作系统根据业务能力进行拆分业务能力定义了一…...
taro vue3 ts nut-ui 项目
# 使用 npm 安装 CLI $ npm install -g tarojs/cli 查看 Taro 全部版本信息 可以使用 npm info 查看 Taro 版本信息,在这里你可以看到当前最新版本 npm info tarojs/cli 项目初始化 使用命令创建模板项目: taro init 项目名 taro init myApp …...
【群答疑】jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参...
一个非常不错的问题,来检验下自己jmeter基本功 可能有同学没看懂题,这里再解释一下,上面问题需求是:jmeter关联获取上一个请求返回的字符串,分割后保存到数组,把数组元素依次作为下一个请求的入参 建议先自…...
Shell 函数详解(函数定义、函数调用)
Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。 Shell 中的函数和C、Java、Python、C# 等其它编程语言中的函数类似,只是在语法细节有所差别。 Shell 函数定义的语…...
git-命令行显示当前目录分支
1. 打开家目录.bashrc隐藏文件,找到如下内容 forlinxubuntu:~$ vi ~/.bashrcif [ "$color_prompt" yes ]; thenPS1${debian_chroot:($debian_chroot)}\[\033[01;32m\]\u\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ elsePS1${debian_chroot:($debi…...
pgsql 报错 later table “drop column” is not supported now
报错 使用pgsql执行下面的SQL报错 alter table test_user drop clolumn name;报错信息: later table “drop column” is not supported now。 报错原因 hologres pgsql的数据库: 删除列目前还是灰度测试阶段,需要在sql前加上set hg_ex…...
如何制定私域流量布局计划?
01 确定目标用户群体 首先,明确目标用户是私域流量布局的基础。可以通过市场调研、用户画像和数据分析等方式,了解目标用户的年龄、性别、兴趣爱好等特征,为后续精准营销奠定基础。 02 选择合适的私域流量渠道 根据目标用户群体的特点&…...
yolov8 模型部署--TensorRT部署-c++服务化部署
写目录 yolov8 模型部署--TensorRT部署1、模型导出为onnx格式2、模型onnx格式转engine 部署 yolov8 模型部署–TensorRT部署 1、模型导出为onnx格式 如果要用TensorRT部署YOLOv8,需要先使用下面的命令将模型导出为onnx格式: yolo export modelyolov8n.p…...
自适应迭代扩展卡尔曼滤波算法AIEKF估计SOC VS 扩展卡尔曼估计SOC
自适应迭代扩展卡尔曼滤波算法(AIEK) 自适应迭代扩展卡尔曼滤波算法(AIEK)是一种滤波算法,其目的是通过迭代过程来逐渐适应不同的状态和环境,从而优化滤波效果。 该算法的基本思路是在每一步迭代过程中&a…...
2023-亲测有效-git clone失败怎么办?用代理?加git?
git 克隆不下来,超时 用以下格式: git clone https://ghproxy.com/https://github.com/Tencent/ncnn.git 你的网站前面加上 https://ghproxy.com/ 刷的一下就下完了!!...
An Empirical Study of GPT-3 for Few-Shot Knowledge-Based VQA
本文是LLM系列文章,针对《An Empirical Study of GPT-3 for Few-Shot Knowledge-Based VQA》的翻译。 GPT-3对基于小样本知识的VQA的实证研究 摘要引言相关工作方法OK-VQA上的实验VQAv2上的实验结论 摘要 基于知识的视觉问答(VQA)涉及回答需…...
2023高教社杯数学建模B题思路分析 - 多波束测线问题
# 1 赛题 B 题 多波束测线问题 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播, 在不同界面上产生反射, 利用这一原理,从测量船换能器垂直向海底发射声波信 号,并记录从声波发射到…...
02-docker network
Docker网络 Docker网络是什么 Docker 网络是 Docker 容器之间进行通信和连接的网络环境。在 Docker 中,每个容器都有自己的网络命名空间,这意味着每个容器都有自己的网络接口、IP 地址和网络配置 Docker网络启动后,会在宿主机中建立一个名…...
栈和队列经典笔试题
文章目录 栈和队列的回顾💻栈🩳队列👟 栈和队列经典笔试题🔋有效的括号🎸用队列实现栈 🕯用栈实现队列🔭设计循环队列🧼 安静的夜晚 你在想谁吗 栈和队列的回顾💻 栈&am…...
No5.9:多边形内角和公式
#!/usr/bin/python # -*- coding: UTF-8 -*-#指定了编码,中文就能正常展示 # codingutf-8def calc_degree(n):#n代表边形的总数degree (n - 2) * 180#多边形内角和公式return degreeprint(calc_degree(3))#三角形的内角和 print(calc_degree(4))#四边形的内角和【小…...
wordpress 热门排序/seo草根博客
Vue,v-for循环遍历方式 1.v-for循环普通数组 item是自定义名称, in后面加的是 list这个普通数组 1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"utf-8">5 <title></title>6 </head&…...
做网站的s标的软件/郑州网络营销推广
概要 本分步指南介绍如何在 Microsoft Visual Studio 2005年中的可执行文件 (.exe) 文件中嵌入的清单文件。如果您要开发"认证 Windows Vista"程序,您需要将清单文件嵌入在可执行文件。更多信息 在本文中,占位符appname是指一个示例应用程序。…...
大学生个人网站怎么做/网站备案查询
安装环境准备 1.安装 jdk 2.安装Maven 依赖关系如下: 因为没有现成的安装包,需要使用Maven对Github上的源码进行编译。所以安装的Jdk版本取决于你的Maven版本。至于Maven版本的选择就选择最新的。 以下是我安装的版本: 具体安装步骤…...
erp网站建设方案/百度广告一天多少钱
在这篇文章中,我们将谈谈如何在Angular JS中将XML文件转换为JSON。大家都知道Angular JS是开发应用程序的JavaScript框架。所以基本上Angular JS期望得 到的响应式JSON格式的。因此,在你开始对数据进行操作之前,建议返回JSON格式的数据。在这…...
给企业做网站的平台/广州优化疫情防控举措
【IAR工程】STM8S基于ST标准库读取DS1302数据✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!🍁对于文中所提供的相关资源链接将作不定期更换。&…...
网站建设论文选题背景/哈尔滨优化推广公司
本文已获得原作者的独家授权,有想转载的朋友们可以在后台联系我申请开白哦!PS:欢迎掘友们向我投稿哦,被采用的文章还可以送你掘金精美周边!原文地址:Why React Hooks Are the Wrong Abstraction原文作者&am…...