This commit is contained in:
Estom
2021-06-17 15:54:33 +08:00
parent f060b3c369
commit 4a1f34cd02
20 changed files with 504 additions and 108 deletions

View File

@@ -32,8 +32,8 @@
### 秘钥算法目标
* 加密,肯定是不希望别人知道我的消息,所以只要我才能解密。所以得出,公钥负责加密,私钥负责解密。
* 签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名, 所以得出,私钥负责签名,公钥负责验证。
* 加密,保证数据的隐私性。肯定是不希望别人知道我的消息,所以只要我才能解密。所以得出,公钥负责加密,私钥负责解密。
* 签名,保证数据的完整性。那肯定是不希望有人冒充我发消息,只有我才能发布这个签名, 所以得出,私钥负责签名,公钥负责验证。
## 2 非对称加密RSA实现

View File

@@ -1,5 +1,6 @@
## 1 简介
### 协议简介
SSL/TLS是一种密码通信框架他是世界上使用最广泛的密码通信方法。SSL/TLS综合运用了密码学中的对称密码消息认证码公钥密码数字签名伪随机数生成器等可以说是密码学中的集大成者。
@@ -8,132 +9,215 @@ SSL(Secure Socket Layer)安全套接层是1994年由Netscape公司设计的
TLS(Transport Layer Security)传输层安全是IETF在SSL3.0基础上设计的协议实际上相当于SSL的后续版本。
## 2 应用
SSL/TLS是一个安全通信框架上面可以承载HTTP协议或者SMTP/POP3协议等。下层基于TCP可靠数据连接实现。
![](image/2021-06-15-20-11-58.png)
### 加密算法
* 非对称加密算法RSADSA/DSS,DiffieHellman
* 对称加密算法AESRC43DES
* HASH算法MD5SHA1SHA256
* Record协议中的MAC(Message Authentication Code)算法
* premaster secret、master secret生成算法
## 3 架构
![](image/2021-06-15-20-12-34.png)
TLS主要分为两层
* 底层的是TLS记录协议主要负责使用对称密码对消息进行加密。
* 上层的是TLS握手协议主要分为握手协议密码规格变更协议和应用数据协议4个部分。
* 握手协议负责在客户端和服务器端商定密码算法和共享密钥包括证书认证是4个协议中最最复杂的部分。
* 密码规格变更协议负责向通信对象传达变更密码方式的信号
* 警告协议负责在发生错误的时候将错误传达给对方
* 应用数据协议负责将TLS承载的应用数据传达给通信对象的协议。
## 4 握手协议
握手协议是TLS协议中非常重要的协议通过客户端和服务器端的交互和共享一些必要信息从而生成共享密钥和交互证书。
![](image/2021-06-15-23-09-52.png)
![](image/2021-06-15-20-41-00.png)
### 1 客户端请求SSL内容
* client hello客户端向服务器端发送一个client hello的消息包含下面内容
1. 可用版本号
2. 当前时间
3. 客户端随机数
4. 会话ID
5. 可用的密码套件清单
6. 可用的压缩方式清单
我们之前提到了TLS其实是一套加密框架其中的有些组件其实是可以替换的这里可用版本号可用的密码套件清单可用的压缩方式清单就是向服务器询问对方支持哪些服务。
客户端随机数是一个由客户端生成的随机数,用来生成对称密钥。
### 2 服务器响应SSL内容
* server hello服务器端收到client hello消息后会向客户端返回一个server hello消息包含如下内容
1. 使用的版本号。使用的版本号使用的密码套件使用的压缩方式是对步骤1的回答。
2. 当前时间
3. 服务器随机数。服务器随机数是一个由服务器端生成的随机数,用来生成对称密钥。
4. 会话ID
5. 使用的密码套件
6. 使用的压缩方式
* 可选步骤:certificate服务器端发送自己的证书清单因为证书可能是层级结构的所以处理服务器自己的证书之外还需要发送为服务器签名的证书。客户端将会对服务器端的证书进行验证。如果是以匿名的方式通信则不需要证书。
* 可选步骤:ServerKeyExchange。如果第三步的证书信息不足则可以发送ServerKeyExchange用来构建加密通道。ServerKeyExchange的内容可能包含两种形式
* 如果选择的是RSA协议那么传递的就是RSA构建公钥密码的参数EN。我们回想一下RSA中构建公钥的公式密文=明文^E\ mod\ N密文=明文EmodN 只要知道了E和N那么就知道了RSA的公钥这里传递的就是EN两个数字。具体内容可以参考RSA算法详解
* 如果选择的是Diff-Hellman密钥交换协议那么传递的就是密钥交换的参数具体内容可以参考更加安全的密钥生成方法Diffie-Hellman
* 可选步骤:CertificateRequest如果是在一个受限访问的环境比如fabric中服务器端也需要向客户端索要证书。如果并不需要客户端认证则不需要此步骤。
* server hello done 服务器端发送server hello done的消息告诉客户端自己的消息结束了。
### 3 客户端交换秘钥证书
* 可选步骤:Certificate。对步骤5的回应客户端发送客户端证书给服务器
* ClientKeyExchange还是分两种情况
* 如果是公钥或者RSA模式情况下客户端将根据客户端生成的随机数和服务器端生成的随机数生成预备主密码通过该公钥进行加密返送给服务器端。
* 如果使用的是Diff-Hellman密钥交换协议则客户端会发送自己这一方要生成Diff-Hellman密钥而需要公开的值。具体内容可以参考更加安全的密钥生成方法Diffie-Hellman这样服务器端可以根据这个公开值计算出预备主密码。
* 可选步骤:CertificateVerify客户端向服务器端证明自己是客户端证书的持有者。
* ChangeCipherSpec(准备切换密码)ChangeCipherSpec是密码规格变更协议的消息表示后面的消息将会以前面协商过的密钥进行加密。
* finished(握手协议结束)客户端告诉服务器端握手协议结束了。
### 4 服务器交换秘钥证书
* ChangeCipherSpec(准备切换密码)服务器端告诉客户端自己要切换密码了。
* finished(握手协议结束)服务器端告诉客户端,握手协议结束了。
* 切换到应用数据协议。这之后服务器和客户端就是以加密的方式进行沟通了。
### 主密码和预备主密码
* 上面的步骤8生成了预备主密码主密码是根据密码套件中定义的单向散列函数实现的伪随机数生成器+预备主密码+客户端随机数+服务器端随机数生成的。
* 主密码主要用来生成称密码的密钥消息认证码的密钥和对称密码的CBC模式所使用的初始化向量。详见分组密码和模式
## 5 记录协议
TLS记录协议主要负责消息的压缩加密及数据的认证
![](image/2021-06-15-20-59-12.png)
消息首先将会被分段然后压缩再计算其消息验证码然后使用对称密码进行加密加密使用的是CBC模式CBC模式的初始向量是通过主密码来生成的。
得到密文之后会附加类型,版本和长度等其他信息,最终组成最后的报文数据。
## 6 加密算法
### 对称密码
### 消息认证码
### 公钥密码
### 数字签名
### 伪随机数生成器
## 7 协议关系
### 协议概念
* TCP
TCPTransmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是七层协议中的第四层传输层的协议之一,大名鼎鼎的三次握手就发生在这里
TCPTransmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,是七层协议中的第四层传输层的协议之一。
* HTTPS
HTTPS全称Hyper Text Transfer Protocol over Secure Socket Layer是以安全为目标的HTTP通道简单讲是HTTP的安全版。
* SSL
SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。
SSL(Secure Sockets Layer 安全套接层)是为网络通信提供安全及数据完整性的一种安全协议。当前版本为3.0。它已被广泛地用于Web浏览器与服务器之间的身份认证和加密数据传输。
* TLS
安全传输层协议TLSTransport Layer Security用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成 TLS 记录协议TLS Record和 TLS 握手协议TLS Handshake是更新、更安全的SSL版本。
### 关系说明
### 协议关系
![](image/2021-06-17-00-10-16.png)
* HTTPS是应用层的安全协议TCP是传输层的协议但是它不安全因为它是明文传输的所以SSL的诞生就是给TCP加了一层保险使HTTPS和TCP之间使用加密传输。而TLS只是SSL的升级版他们的作用是一样的。
* SSL 凭证安装于伺服器例如网站服务器但是在浏览器上使用者仍可看到网站是否受到SSL 的保护。首先如果SSL 出现在网站上使用者看到的网址会是以https:// 开头而不是http:// 多出的一个s 代表「安全」)。按照企业所获得的验证或凭证等级,安全连接会通过挂锁图标或绿色地址栏来显示。
* HTTPS会在网站受到SSL凭证保护时在网址中出现。该凭证的详细资料包括发行机构与网站拥有人的企业名称可以通过按一下浏览器列上的锁定标记进行检视。
* 应用最广泛的是TLS1.0接下来是SSL3.0 。但主流浏览器都已经实现了TLS 1.2 的支持。TLS 1.0有时被标示为SSL 3.1TLS 1.1为SSL 3.2TLS 1.2为SSL 3.3。TLS和SSL协议理论上属于传输层在应用层实现所以我们可以在浏览器中设置是否使用此协议使用哪一版本的协议。
## 2 应用
SSL/TLS是一个安全通信框架上面可以承载HTTP协议或者SMTP/POP3协议等。下层基于TCP可靠数据连接实现。
![](image/2021-06-15-20-11-58.png)
### 主要功能
* 数据完整性:内容传输经过完整性校验
* 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
* 身份认证:第三方无法伪造服务端(客户端)身份
数据完整性和隐私性由TLS Record Protocol保证身份认证由TLS Handshaking Protocols实现。
### 安全性
- 可以使用非对称或公钥、密码术例如RSA [RSA]、DSA [DSS] 等)来验证对等方的身份。此身份验证可以是可选的,但通常需要至少其中一位同行。
- 共享机密的协商是安全的:窃听者无法获得协商的机密,并且对于任何经过身份验证的连接,即使攻击者可以将自己置于连接中间,也无法获得该机密。
- 协商可靠:任何攻击者都不能在不被通信双方检测到的情况下修改协商通信。
## 3 架构
![](image/2021-06-15-20-12-34.png)
TLS主要分为两层
* TLS Record Protocol底层的是TLS记录协议主要负责使用对称密码主密钥对消息进行加密。
* TLS Handshake Protocol上层的是TLS握手协议主要分为握手协议密码规格变更协议和应用数据协议4个部分。
* Handshake protocol握手协议负责在客户端和服务器端商定密码算法和共享密钥包括证书认证是4个协议中最最复杂的部分。
* Change cipher spec protocol密码规格变更协议负责向通信对象传达变更密码方式的信号
* Alert protocol警告协议负责在发生错误的时候将错误传达给对方
* Application data protocol应用数据协议负责将TLS承载的应用数据传达给通信对象的协议。
## 4 握手协议
握手协议是TLS协议中非常重要的协议通过客户端和服务器端的交互和共享一些必要信息从而生成共享密钥和交互证书。
![](image/2021-06-15-23-09-52.png)
![](image/2021-06-15-20-41-00.png)
![](image/2021-06-16-22-33-20.png)
### 4.1 客户端请求SSL内容
* client hello客户端向服务器端发送一个client hello的消息包含下面内容
```
1. 可用版本号TSL1.0,TSL1.1,TSL1.2
2. 当前时间
3. 客户端随机数。
4. 会话ID
5. 可用的密码套件清单。RSA、AES、MD5
6. 可用的压缩方式清单。
```
### 4.2 服务器响应SSL内容
* server hello服务器端收到client hello消息后会向客户端返回一个server hello消息包含如下内容
```
1. 使用的版本号。使用的版本号,使用的密码套件,使用的压缩方式。
2. 当前时间
3. 服务器随机数。
4. 会话ID
5. 使用的密码套件
6. 使用的压缩方式
```
* 可选步骤:certificate服务器端发送自己的证书清单。因为证书可能是层级结构的所以处理服务器自己的证书之外还需要发送为服务器签名的证书。客户端将会对服务器端的证书进行验证。如果是以匿名的方式通信则不需要证书。
* 可选步骤:ServerKeyExchange。如果第三步的证书信息不足则可以发送ServerKeyExchange用来构建加密通道。ServerKeyExchange的内容可能包含两种形式
* 如果选择的是RSA协议那么传递的就是RSA构建公钥。
* 如果选择的是Diff-Hellman密钥交换协议那么传递的就是密钥交换的参数。
* 可选步骤:CertificateRequest如果是在一个受限访问的环境比如fabric中服务器端也需要向客户端索要证书。如果并不需要客户端认证则不需要此步骤。
* server hello done 服务器端发送server hello done的消息告诉客户端自己的消息结束了。
### 4.3 客户端交换秘钥证书
* 可选步骤:Certificate。客户端发送客户端证书给服务器。
* ClientKeyExchange还是分两种情况
* 如果是公钥或者RSA模式情况下客户端将根据客户端生成的随机数和服务器端生成的随机数生成预备主密码通过该公钥进行加密返送给服务器端。
* 如果使用的是Diff-Hellman密钥交换协议则客户端会发送自己这一方要生成Diff-Hellman密钥而需要公开的值。
* 可选步骤:Certificate Verify客户端向服务器端证明自己是客户端证书的持有者。
* ChangeCipherSpec。密码规格变更协议的消息表示后面的消息将会以前面协商过的密钥进行加密。
* finished(握手协议结束)客户端告诉服务器端握手协议结束了。
### 4.4 服务器交换秘钥证书
* ChangeCipherSpec。服务器端告诉客户端自己要切换密码了。
* finished(握手协议结束)服务器端告诉客户端,握手协议结束了。
### 握手协议——RSA握手协议
![](image/2021-06-17-11-43-17.png)
### 握手协议——DH握手协议
![](image/2021-06-17-11-46-08.png)
## 5 记录协议
TLS记录协议主要负责消息的压缩加密和认证。当TLS完成握手过程后客户端和服务端确定了加密压缩和MAC算法及其参数数据Record会通过指定算法处理。Record首先被加密然后添加MACmessage authentication code以保证数据完整性。
![](image/2021-06-15-20-59-12.png)
* 在发送端将数据Record分段压缩增加MAC(Message Authentication Code)和加密。消息首先将会被分段然后压缩再计算其消息验证码然后使用对称密码进行加密加密使用的是CBC模式CBC模式的初始向量是通过主密码来生成的。
* 在接收端将数据Record解密验证MAC解压并重组得到密文之后会附加类型版本和长度等其他信息最终组成最后的报文数据。
## 6 master secret密码计算
1. [明文] 客户端发送随机数client_random
2. [明文] 服务器返回随机数server_random
3. [RSA] 客户端使用证书中的公钥加密premaster secret发送给服务端
4. 服务端使用私钥解密premaster secret
5. 两端分别通过client_randomserver_random和premaster secret生成master secret用于对称加密后续通信内容
一般的主密码计算方法
```
master_secret = PRF(pre_master_secret, "master secret", ClientHello.random + ServerHello.random)[0..47];
```
扩展的主密码计算方法
```
session_hash = Hash(handshake_messages)
master_secret = PRF(pre_master_secret, "extended master secret",session_hash)[0..47];
```
### 三重握手攻击
三重握手(Triple Handshake) (CVE-2014-1295)攻击者A分别与客户端C和服务器S握手协商出同一个主密钥之后令客户端C和服务器S之间重新协商renegotiation或继续resumption会话来握手。可攻破重新协商TLS Exporter RFC5705和"tls-unique" RFC5929。
```
C客户端。 A 攻击者 S服务端
C向A发送“ ClientHello”A将其转发给S。
S向A发送“ ServerHello”A将其转发给C。
S将包含其证书链的“证书”发送给A。
A用自己的证书链替换它并将其发送给C。
S向A发送“ ServerHelloDone”A将其转发给C。
C向A发送“ ClientKeyExchange”其中包含
“ pre_master_secret”已使用A的公钥加密。解密
“ pre_master_secret”使用S的公钥对其重新加密并且
将其发送给S。
C向A发送“完成”。A计算其“完成”
与S连接并将其发送给S。
S向A发送“完成”。A计算其“完成”
与C的连接并将其发送给C。
```
通过以上方式如果使用无“Extended Master Secret”扩展字段的计算方式将发现从C->A和从A->S之间使用的会话密钥是一样的这种叫做未知密钥共享unkown key-shareUKS攻击。当使用扩展主密钥的计算方式时因为有session_hash计算了所有协商消息的hash如果中间攻击者A对协商消息进行改动则客户端和服务端计算的hash值则不一样最后计算出的主密钥也会不同。
## 7 Cipher suite密码套件
### 典型构成
* key establishment (typically a Diffie-Hellman variant or RSA)密钥建立(通常是 Diffie-Hellman 变体或 RSA
* authentication (the certificate type)身份验证(证书类型)
* confidentiality (a symmetric cipher)机密性(对称密码)
* integrity (a hash function)完整性(散列函数)
### “AES128-SHA”
* RSA for key establishment (implied)
* RSA for authentication (implied)
* 128-bit Advanced Encryption Standard in Cipher Block Chaining (CBC) mode for confidentiality
* 160-bit Secure Hashing Algorithm (SHA) for integrity
### “ECDHE-ECDSA-AES256-GCM-SHA384”
* Elliptic Curve Diffie-Hellman Ephemeral (ECDHE) key exchange for key establishment 椭圆曲线 Diffie-Hellman Ephemeral ( ECDHE ) 密钥交换
* Elliptic Curve Digital Signature Algorithms (ECDSA) for authentication 身份验证的椭圆曲线数字签名算法 ( ECDSA )
* 256-bit Advanced Encryption Standard in Galois/Counter mode (GCM) for confidentiality
* 384-bit Secure Hashing Algorithm for integrity

View File

@@ -0,0 +1,212 @@
## 1 TSL1.0
### 概念
* TLS(Transport Layer Security传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
* TLS 1.0是IETFInternet Engineering Task ForceInternet工程任务组制定的一种新的协议它建立在SSL 3.0协议规范之上是SSL 3.0的后续版本可以理解为SSL 3.1(可简单理解为同一事物不同阶段的不同称呼),它是写入了 RFC 的。该协议由两层组成: TLS 记录协议TLS Record和 TLS 握手协议TLS Handshake。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP上面。
### 特点
* 对话的内容用”对称加密”,而对于”对称加密”带来的密钥传输问题,则由”非对称加密”来解决,由于客户端没有”非对称加密”的解密能力,所以密钥由客户端来产生并用公钥加密传输给服务端,这样就(在思路上)解决了密钥传输的安全问题和对话数据解密的性能问题
### 技术
```
CipherSuite TLS_NULL_WITH_NULL_NULL = { 0x00,0x00 };
//RSA 密钥建立、认证套件
CipherSuite TLS_RSA_WITH_NULL_MD5 = { 0x00,0x01 };
CipherSuite TLS_RSA_WITH_NULL_SHA = { 0x00,0x02 };
CipherSuite TLS_RSA_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x03 };
CipherSuite TLS_RSA_WITH_RC4_128_MD5 = { 0x00,0x04 };
CipherSuite TLS_RSA_WITH_RC4_128_SHA = { 0x00,0x05 };
CipherSuite TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = { 0x00,0x06 };
CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00,0x07 };
CipherSuite TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x08 };
CipherSuite TLS_RSA_WITH_DES_CBC_SHA = { 0x00,0x09 };
CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0A };
//DH 密钥建立 RSA/DSS 认证套件
CipherSuite TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0B };
CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA = { 0x00,0x0C };
CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0D };
CipherSuite TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x0E };
CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA = { 0x00,0x0F };
CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x10 };
CipherSuite TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x11 };
CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA = { 0x00,0x12 };
CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x13 };
CipherSuite TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x14 };
CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA = { 0x00,0x15 };
CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x16 };
//DH 密钥建立 no 认证套件
CipherSuite TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00,0x17 };
CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00,0x18 };
CipherSuite TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = { 0x00,0x19 };
CipherSuite TLS_DH_anon_WITH_DES_CBC_SHA = { 0x00,0x1A };
CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00,0x1B };
```
## 2 TSL1.1
### 特点
相对之前版本的变化
- 隐式初始化向量IV被显式IV替换以防止CBC攻击[CBCATT]。
- 填充错误的处理被更改为使用坏的\u记录\u mac警报而不是解密失败的警报以防止CBC攻击。
- IANA注册表是为协议参数定义的。
- 过早关闭不再导致会话不可恢复。
- 为TLS上的各种新攻击添加了其他信息注释。
### 技术
* 密码套件
```
//RSA 加密、认证套件
CipherSuite TLS_RSA_WITH_NULL_MD5 = { 0x00,0x01 };
CipherSuite TLS_RSA_WITH_NULL_SHA = { 0x00,0x02 };
CipherSuite TLS_RSA_WITH_RC4_128_MD5 = { 0x00,0x04 };
CipherSuite TLS_RSA_WITH_RC4_128_SHA = { 0x00,0x05 };
CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00,0x07 };
CipherSuite TLS_RSA_WITH_DES_CBC_SHA = { 0x00,0x09 };
CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0A };
//DH 加密 RSA/DSS 认证套件
CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA = { 0x00,0x0C };
CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0D };
CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA = { 0x00,0x0F };
CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x10 };
CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA = { 0x00,0x12 };
CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x13 };
CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA = { 0x00,0x15 };
CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x16 };
//DH 加密 no 认证套件
CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00,0x18 };
CipherSuite TLS_DH_anon_WITH_DES_CBC_SHA = { 0x00,0x1A };
CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00,0x1B };
```
## 3 TSL1.2
### 特点
本文件是TLS 1.1[TLS1.1]协议的修订版,其中包含改进的灵活性,特别是对于密码算法的协商。主要变化是:
- 伪随机函数PRF中的MD5/SHA-1组合已被密码套件指定的PRF所取代。本文档中的所有密码套件都使用P_SHA256。
- MD5/SHA-1组合在数字电视中的应用.签名元素已被替换为单个哈希。有符号元素现在包含一个字段,该字段显式指定所使用的哈希算法。
- 增加了对附加数据模式的认证加密的支持。
- TLS扩展定义和AES密码套件由外部[TLSEXT]和[TLSAES]合并而成。
- 更严格地检查加密的premastersecret版本号。
- 验证数据的长度现在取决于密码套件默认值仍然是12
- 在许多情况下,现在必须发送警报。
- 在证书请求之后,如果没有可用的证书,客户端现在必须发送一个空的证书列表。
- TLS_RSA_WITH_AES_128_CBC_SHA现在是实现密码套件的必备工具。
- 添加HMAC-SHA256密码套件。
- 删除IDEA和DES密码套件。它们现在已被弃用并将记录在一个单独的文档中。
- 支持SSLv2
### 技术
* 密码套件
```
//RSA 加密、认证套件
CipherSuite TLS_RSA_WITH_NULL_MD5 = { 0x00,0x01 };
CipherSuite TLS_RSA_WITH_NULL_SHA = { 0x00,0x02 };
CipherSuite TLS_RSA_WITH_NULL_SHA256 = { 0x00,0x3B };
CipherSuite TLS_RSA_WITH_RC4_128_MD5 = { 0x00,0x04 };
CipherSuite TLS_RSA_WITH_RC4_128_SHA = { 0x00,0x05 };
CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0A };
CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA = { 0x00,0x2F };
CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA = { 0x00,0x35 };
CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA256 = { 0x00,0x3C };
CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA256 = { 0x00,0x3D };
//DH 加密 RSA/DSS 认证套件
CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x0D };
CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x10 };
CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00,0x13 };
CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00,0x16 };
CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA = { 0x00,0x30 };
CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA = { 0x00,0x31 };
CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA = { 0x00,0x32 };
CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA = { 0x00,0x33 };
CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA = { 0x00,0x36 };
CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA = { 0x00,0x37 };
CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA = { 0x00,0x38 };
CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA = { 0x00,0x39 };
CipherSuite TLS_DH_DSS_WITH_AES_128_CBC_SHA256 = { 0x00,0x3E };
CipherSuite TLS_DH_RSA_WITH_AES_128_CBC_SHA256 = { 0x00,0x3F };
CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA256 = { 0x00,0x40 };
CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 = { 0x00,0x67 };
CipherSuite TLS_DH_DSS_WITH_AES_256_CBC_SHA256 = { 0x00,0x68 };
CipherSuite TLS_DH_RSA_WITH_AES_256_CBC_SHA256 = { 0x00,0x69 };
CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA256 = { 0x00,0x6A };
CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 = { 0x00,0x6B };
//DH 加密 no 认证套件
CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00,0x18 };
CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00,0x1B };
CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA = { 0x00,0x34 };
CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA = { 0x00,0x3A };
CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA256 = { 0x00,0x6C };
CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA256 = { 0x00,0x6D };
```
## 4 TSL1.3
### 特点
- 受支持的对称加密算法列表已从所有被认为是遗留的算法中删去。剩下的都是使用关联数据AEAD算法进行身份验证的加密。密码套件的概念已经改变将身份验证和密钥交换机制与记录保护算法包括密钥长度分开并将哈希与密钥派生函数和握手消息身份验证码MAC一起使用。
- 添加了零往返时间0-RTT模式节省了一些应用程序数据在连接设置时的往返时间但牺牲了某些安全属性。
- 删除了静态RSA和Diffie-Hellman密码所有基于公钥的密钥交换机制现在都提供前向保密性。
- ServerHello之后的所有握手消息现在都已加密。新引入EncryptedExtensions消息允许以前在服务器hello中以明文形式发送的各种扩展也享受保密保护。
- 重新设计了密钥派生函数。新的设计由于其改进的密钥分离特性使得密码学家可以更容易地进行分析。基于HMAC的提取和扩展密钥派生函数HKDF被用作底层原语。
- 握手状态机已经被显著地重新构造为更加一致并且删除了诸如ChangeCipherSpec之类的多余消息除了在需要中间盒兼容性时
- 椭圆曲线算法现在是基本规范新的签名算法如EdDSA包括在内。TLS 1.3删除了点格式协商,支持每条曲线的单点格式。
- 进行了其他加密改进,包括更改 RSA 填充以使用 RSA 概率签名方案 (RSASSA-PSS),以及取消压缩、数字签名算法 (DSA) 和自定义临时 Diffie-Hellman (DHE) 组。
- TLS 1.2 版本协商机制已被弃用,以支持扩展中的版本列表。 这增加了与错误实施版本协商的现有服务器的兼容性。
- 带有和不带有服务器端状态的会话恢复以及早期 TLS 版本的基于 PSK 的密码套件已被一个新的 PSK 交换所取代。
### 技术
* 新增的加密套件套件
```
+------------------------------+-------------+
| Description | Value |
+------------------------------+-------------+
| TLS_AES_128_GCM_SHA256 | {0x13,0x01} |
| | |
| TLS_AES_256_GCM_SHA384 | {0x13,0x02} |
| | |
| TLS_CHACHA20_POLY1305_SHA256 | {0x13,0x03} |
| | |
| TLS_AES_128_CCM_SHA256 | {0x13,0x04} |
| | |
| TLS_AES_128_CCM_8_SHA256 | {0x13,0x05} |
+------------------------------+-------------+
```

80
加密/4 TLS1.3特性.md Normal file
View File

@@ -0,0 +1,80 @@
## 1 TSL1.2---->1.3变化
### 密钥协商机制改变
密钥协商机制改变TLS1.3借助扩展进行密钥交换TLS1.3只需要三次握手交互TLS1.2则需要四次握手。相比过去的的版本,引入了新的密钥协商机制 — PSK
* TLS1.2它通过KeyExchange进行密钥协商即ServerKeyExchange和ClientKeyExchange那么密钥交换本身就需要一个交互来回所以总共有四次握手交互。
![](image/2021-06-17-13-42-45.png)
![](image/2021-06-17-15-16-54.png)
* TLS1.2 通过会话重建来加速完成密钥协商过程。
![](image/2021-06-17-15-16-35.png)
* TLS1.3通过ClientHello和ServerHello的扩展进行密钥交换那么就省去了1.2版本中KeyExchange的过程也就省去了一次握手。
![](image/2021-06-17-13-44-32.png)
![](image/2021-06-17-15-18-48.png)
* TLS1.3 0-RTT模式密钥交换。以某些安全属性为代价。当client和server共享一个预共享密钥PSK从外部获得或通过一个以前的握手获得TLS 1.3允许client在第一个发送出去的消息的early data中携带数据client使用这个PSK来认证server并加密early data。即在握手之前就有了PSK时在第一次发送ClientHello时就可以发送加密数据达到0-RTT数据传输的目的。
![](image/2021-06-17-13-45-46.png)
![](image/2021-06-17-15-15-49.png)
### 简化与改进
* 其他还包括新的密钥派生函数删除多余的报文消息ChangeCipherSpec但我抓包测试时还是有
* 全面使用ECC密码算法删除不具有前向安全的密码套件。废弃了 3DES、RC4、AES-CBC 等加密组件,废弃了 SHA1、MD5 等哈希算法
* 不再允许对加密报文进行压缩、不再允许双方发起重协商
* DSA 证书不再允许在 TLS 1.3 中使用
* TLS 1.3 的握手不再支持静态的 RSA 密钥交换,这意味着必须使用带有前向安全的 Diffie-Hellman 进行全面握手。
* ServerHello之后的所有握手消息都被加密引入了加密扩展EncryptedExtension。ServerHello 之后的所有握手消息采取了加密操作,可见明文大大减少
## 2 密钥交换机制(握手协议)
### RSA 秘钥交换TSL1.2
1. client 发起请求Client Hello
2. server 回复 certificate
3. client使用证书中的公钥加密预主秘钥发给 serverClient Key Exchange
4. server 提取出 预主秘钥计算主秘钥然后发送对称秘钥加密的finished。
5. client 计算主秘钥,验证 finished验证成功后就可以发送Application Data了。
缺点RSA秘钥交换不是前向安全算法证书对应私钥泄漏后之前抓包的报文都能被解密。所以在 TLS 1.3中 RSA 已经废弃了。
### ECDHE秘钥交换TSL1.3
1. client 发送请求Client Helloextension携带支持的椭圆曲线类型。
2. server 回复 Server Hello和certificate等server选择的椭圆曲线参数然后 生成私钥BIGNUM乘以椭圆曲线的base point得到公钥POINT顺便签个名表示自己拥有证书然后将报文发给client报文就是Server Key Exchange其包含了server选择的椭圆曲线参数、自己根据这个参数计算的公钥、自己用证书的私钥对当前报文的签名。
3. client 收到 Server Key Exchange获得椭圆曲线参数生成私钥BIGNUM后计算公钥POINT然后把公钥发出去Client Key Exchange。client使用自己的私钥BIGNUM和server的公钥POINT计算出主秘钥。
4. server 收到 client的公钥POINT使用自己的私钥BIGNUM计算主秘钥。两端主秘钥是一致。
### 1-RTT模式密钥交换TSL1.3
TLS 1.3 中是这样优化握手的:
1. client 发送请求Client Helloextension携带支持的椭圆曲线类型。且对每个自己支持的椭圆曲线类型计算公钥POINT。公钥放在extension中的keyshare中。
1. 支持的加密套件(该作用和之前一样)。
2. supproted_versions 拓展。包含自己支持的TLS协议版本号。之前协议没有
3. supproted_groups 拓展,表示自己支持的椭圆曲线类型。
4. key_share拓展。包含supprot_groups中各椭圆曲线对应的public key。当然可以发送空的然后server会回复hello request其中会包含server的key_share可以用来探测这里不讨论。key_share中的椭圆曲线类型必须出现在supproted_groups中。之前协议没有
2. server 回复 Server Hello和certificate等server选择的椭圆曲线参数然后乘以椭圆曲线的base point得到公钥POINT。然后提取Client Hello中的key_share拓展中对应的公钥计算主秘钥。公钥POINT不再和之前的以协议一样放在Server Key Exchange中而是放在Server Hello的key_share拓展中。client收到server的公钥POINT后计算主秘钥。
1. 1supproted_versions 拓展。包含自己从client的supproted_versions中选择的TLS协议版本号。之前协议没有
2. 2key_share拓展。包含自己选中的椭圆曲线以及自己计算出来的公钥。之前协议没有
3. server 发送Change Cipher Spec。允许不发送
4. server发送Encrypted Extension。加密的ServerHello之后必须立刻发送Encrypted Extension。这是第一个被加密的数据数据。显然放在这里的拓展是和秘钥协商没关系的拓展。之前协议没有
5. server发送Certificate加密的。这个报文和之前的协议没有太大区别在证书链中的每个证书后面都有一个extension。双向认证时也会有区别有机会再说。这个extension目前只能是OCSP Status extension和SignedCertificateTimestamps。
6. server发送Certificate Verify加密的这个报文并不陌生但是以前只出现在双向认证客户端认证以前Certificate Verify生成的逻辑是将当前所有的握手报文解析解析签名简单的md+非对称加密)。
7. server回复Finished加密的这个报文的目的和之前协议一样检验握手报文的完整性。但是计算方法有变化。
### 0-RTT模式密钥交换
* 以某些安全属性为代价。当client和server共享一个预共享密钥PSK从外部获得或通过一个以前的握手获得TLS 1.3允许client在第一个发送出去的消息的early data中携带数据client使用这个PSK来认证server并加密early data。即在握手之前就有了PSK时在第一次发送ClientHello时就可以发送加密数据达到0-RTT数据传输的目的。
![](image/2021-06-17-13-45-46.png)
## 3 椭圆曲线
然后我们来看下ECDH的秘钥协商过程首先EC的意思是椭圆曲线这个EC提供了一个很厉害的性质你在曲线上找一个点P给定一个整数K求解Q=KP很容易给定一个点P,Q知道Q =KP求K却是个难题。在这个背景下给定一个大家都知道的大数Gclient在每次需要和server协商秘钥时生成一段随机数a然后发送A=a*G给serverserver收到这段消息a*G生成一段随机数b然后发送B=b*G给client然后server端计算(a*G)*b作为对称秘钥client端收到后b*G后计算a*(G*b),因为(a*G)*b = a*(G*b)所以对称秘钥就是a*G*b啦攻击者只能截获A=a*G和B=b*G由于椭圆曲线难题知道A和G是很难计算a和b的也就无法计算a*G*b了
## 4 中间人攻击
中间人攻击Man-in-the-MiddleAttack简称“MITM攻击”是一种“间接”的入侵攻击这种攻击模式是通过各种技术手段将受入侵者控制的一台计算机虚拟放置在网络连接中的两台通信计算机之间这台计算机就称为“中间人”。

1
加密/5 TLS实验.md Normal file
View File

@@ -0,0 +1 @@
![](image/2021-06-17-14-34-10.png)

6
加密/6 加密算法.md Normal file
View File

@@ -0,0 +1,6 @@
* 非对称加密算法RSADSA/DSS
* 对称加密算法AESRC43DES
* HASH算法MD5SHA1SHA256
* Record协议中的MAC(Message Authentication Code)算法
* premaster secret、master secret生成算法

View File

@@ -2,7 +2,13 @@
## 1 HTTPS
### 主要功能
* 数据完整性:内容传输经过完整性校验
* 数据隐私性:内容经过对称加密,每个连接生成一个唯一的加密密钥
* 身份认证:第三方无法伪造服务端(客户端)身份
数据完整性和隐私性由TLS Record Protocol保证身份认证由TLS Handshaking Protocols实现。
### 认证过程
HTTPS在传输数据之前需要客户端浏览器与服务端网站之间进行一次握手在握手过程中将确立双方加密传输数据的密码信息。TLS/SSL协议不仅仅是一套加密传输的协议更是一件经过艺术家精心设计的艺术品TLS/SSL中使用了非对称加密对称加密以及HASH算法。握手过程的具体描述如下

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 571 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

7
加密/会议记录.md Normal file
View File

@@ -0,0 +1,7 @@
网络流量高维特征-------神经网络、深度学习-------分类。
课题3
1. 密码学-dpi
视频、分类。