TLS 记录协议(Record Protocol)是 TLS 协议栈的最底层,负责对数据进行分片、压缩、计算 MAC、加密和传输。理解它的工作原理有助于深入掌握 TLS 安全机制。
记录协议的核心功能
记录协议接收上层数据后,依次经过以下处理流程:
- 分片:将数据切分为固定大小的记录块
- 压缩:对数据进行压缩(TLS 1.3 已废弃)
- MAC 计算:添加消息认证码
- 加密:对数据加密
- 传输:发送加密后的数据
分片机制
每个 TLS 记录包含一个 5 字节的头部和可变长度的载荷:
|
|
- 类型:Content Type,1 字节,标识记录类型
- 0x14 = ChangeCipherSpec
- 0x15 = Alert
- 0x16 = Handshake
- 0x17 = Application Data
- 版本:Protocol Version,2 字节(TLS 1.2 为 0x0303,TLS 1.3 为 0x0303)
- 长度:Payload Length,2 字节,最大 16384 字节
用 Wireshark 观察 TLS 1.2 握手:
|
|
MAC 与加密
TLS 1.2 使用 MAC-then-Encrypt 模式,TLS 1.3 改为 Authenticated Encryption (AEAD)。
TLS 1.2:MAC-then-Encrypt
|
|
典型结构:
|
|
TLS 1.3:AEAD 加密
TLS 1.3 强制使用 AEAD(认证加密)算法,如 AES-GCM、ChaCha20-Poly1305:
|
|
AEAD 模式同时提供机密性和完整性验证,安全性更高。
记录类型详解
Application Data(0x17)
应用数据记录,加密传输:
|
|
Handshake(0x16)
握手记录,TLS 1.2 使用 MAC-then-Encrypt,TLS 1.3 使用 AEAD:
|
|
Alert(0x15)
警告消息,如 TLS 1.2 的证书链验证失败:
|
|
常见警告码:
- 10 = Unexpected Message
- 20 = Bad Record MAC
- 21 = Decryption Failed
- 22 = Record Overflow
- 51 = Decrypt Error
ChangeCipherSpec(0x14)
TLS 1.2 切换加密算法的信号,TLS 1.3 已废除此类型。
TLS 1.3 的变化
TLS 1.3 对记录协议做了重大简化:
| 特性 | TLS 1.2 | TLS 1.3 |
|---|---|---|
| 压缩 | 支持 | 禁用(安全原因) |
| MAC | HMAC | AEAD |
| 加密时机 | ChangeCipherSpec 后 | Handshake 时同步加密 |
| 记录类型 | 4 种 | 2 种(Handshake + Application) |
TLS 1.3 在握手阶段就使用加密,握手消息也被保护:
|
|
注意 [no label] 表示消息已被加密。
实际观察
用 Wireshark 观察 TLS 记录结构:
- 过滤器:
tls.record.content_type - TLS 1.3 的 Application Data 记录:
- Content Type = 23 (Application Data)
- Encrypted Data 包含加密的应用层数据
|
|
安全影响
记录协议的安全机制直接影响 TLS 的安全性:
- 记录溢出:单个记录最大 16384 字节,攻击者可能尝试构造恶意记录
- MAC 绕过:TLS 1.2 的 MAC-then-Encrypt 曾被发现弱点
- 填充 Oracle:CBC 模式填充验证时机不当导致攻击(如 Lucky Thirteen)
TLS 1.3 通过强制 AEAD 消除了这类攻击面。
总结
TLS 记录协议是 TLS 安全的基石:
- 负责数据的分片、认证和加密
- TLS 1.3 通过 AEAD 简化了安全模型
- 记录头包含类型、版本和长度信息
- 理解记录协议有助于诊断 TLS 问题
参考来源