TLS协商出对称密钥后加密通信的详细过程

📅 2026/6/16 20:05:19
TLS协商出对称密钥后加密通信的详细过程
一、前置TLS 握手完成后得到的密钥体系TLS 握手最终不会只产出单个对称密钥而是一整套会话密钥套件共 4 组独立密钥 初始向量 / 随机数分为客户端→服务端、服务端→客户端两个通信方向双向密钥完全隔离。以最常用的密码套件TLS_AES_128_CBC_SHAAES-128-CBC SHA-1 完整性校验为例 握手阶段通过预主密钥 (PMK) 客户端随机数 (Client Random) 服务端随机数 (Server Random)经密钥派生函数PRF计算生成以下密钥材料客户端写密钥Client Write Key客户端发数据、服务端收数据时加密用的 AES 密钥16 字节对应 AES-128服务端写密钥Server Write Key服务端发数据、客户端收数据时加密用的 AES 密钥16 字节客户端写 IVCBC 模式专用初始化向量16 字节服务端写 IV反向链路 CBC 初始化向量16 字节额外派生MAC 密钥消息认证码密钥用于数据完整性 防篡改和加密密钥相互独立核心规则收发双向密钥、IV 完全分离一条链路出问题不会影响另一条。 你之前学的 AES-128-CBC 所需的Key IV就是从这套密钥材料里直接取用。二、TLS 应用数据整体通信流程总览握手成功 → 进入应用数据阶段每一次业务数据收发都遵循固定流水线发送方原始应用数据 → 分片 → 计算 MAC 校验值 → 拼接数据 MAC → 填充 (PKCS7) → AES-CBC 加密 → 封装 TLS 记录头 → 网络发送接收方解析 TLS 记录头 → 解密 AES-CBC → 移除填充 → 拆分数据 MAC → 校验 MAC → 校验通过则上交原始数据失败直接断开连接下面逐步骤拆解。三、分步详解发送端加密全过程步骤 1TLS 记录分片TLS 规定单条TLS 记录最大长度有限制上层应用数据HTTP/APP 数据会先被切分成多个独立分片每个分片单独加密、单独校验。 每个分片称为一个TLS 记录载荷。步骤 2计算 MAC 消息认证码防篡改、防重放TLS 不会只做加密必须先做完整性校验采用HMAC-SHA1对应本例套件输入内容序列号 记录类型 协议版本 分片明文数据序列号 (Sequence Number)64 位单调递增计数器每条 TLS 记录自增 1核心作用防重放攻击、防报文乱序篡改记录类型 / 版本TLS 协议基础字段使用对应方向的MAC 密钥计算 HMAC 摘要将原始明文分片 HMAC 摘要拼接在一起得到「明文整体」步骤 3PKCS7 填充适配 AES 分组长度当前拼接后的整体数据需要送入 AES-128-CBC 加密AES 分组固定 16 字节CBC 模式要求明文长度必须是 16 字节整数倍TLS 标准强制使用PKCS7 填充和行业通用规则一致计算当前数据还差n字节凑整末尾填充n个字节每个字节值 n若长度刚好整除 16 字节强制填充 16 个0x10步骤 4AES-128-CBC 加密核心对称加密环节4.1 取用密钥与 IV以客户端发送数据为例加密密钥 客户端写密钥握手派生的 16 字节 AES-128 密钥初始向量 IV 客户端写 IV握手派生的 16 字节 IV4.2 CBC 加密执行严格遵循 CBC 算法把填充完成的长数据按 16 字节切分为连续分组、、第一个分组C1​AES_Encrypt(P1​⊕IV)后续分组Cn​AES_Encrypt(Pn​⊕Cn−1​)所有密文分组按顺序拼接得到最终密文数据关键细节TLS 每条记录独立使用初始 IV不同记录之间的 CBC 链路不串联IV 是握手阶段一次性派生不会随每条记录重新随机生成TLS 1.2 CBC 模式特性。步骤 5封装 TLS 记录头网络传输在密文头部追加TLS 记录头5 字节固定字段内容类型应用数据 / 告警等TLS 版本密文总长度2 字节封装完成后通过 TCP 套接字发送到对端。四、分步详解接收端解密 校验全过程接收端流程是发送端的逆序且校验优先任何一步失败直接终止连接。步骤 1解析 TLS 记录头读取 5 字节头部获取数据类型、协议版本、密文长度截取完整密文载荷。步骤 2AES-128-CBC 解密仍以服务端接收客户端数据为例解密密钥 客户端写密钥和加密端完全一致对称密钥特性IV 客户端写 IV将密文按 16 字节分组、、第一个分组解密P1​AES_Decrypt(C1​)⊕IV后续分组解密Pn​AES_Decrypt(Cn​)⊕Cn−1​拼接所有明文分组得到「解密后原始数据含 PKCS7 填充」步骤 3移除 PKCS7 填充读取数据最后一个字节得到填充长度n校验末尾连续n个字节是否全部等于n校验异常 → 判定数据被篡改 / 报文损坏立即发送 TLS 告警断开连接校验正常 → 截断末尾n个填充字节得到「明文 MAC 摘要」拼接体步骤 4拆分明文与 MAC 摘要按 HMAC 长度拆分前半部分是原始应用明文分片后半部分是收到的 MAC 值。步骤 5重新计算 MAC 并校验核心安全关卡取出当前记录的序列号、记录类型、版本、解密后的明文使用对应方向的MAC 密钥本地重新计算 HMAC 摘要对比「本地计算摘要」和「收到的摘要」不一致数据篡改、中间人攻击、报文损坏 → 断连完全一致校验通过步骤 6重组分片上交上层应用多个分片按顺序重组为完整原始数据交给 HTTP、业务程序等上层应用。五、关键补充规则 特性1. 双向通信的密钥使用区分重中之重TLS 是全双工通信收发密钥严格分离通信方向使用密钥使用 IV客户端 → 服务端客户端写密钥客户端写 IV服务端 → 客户端服务端写密钥服务端写 IV同一连接下两个方向是两套独立 AES 密钥互不干扰。2. 序列号的作用容易被忽略每条 TLS 记录的 64 位序列号永不重置、单调递增即使报文加密完全正常若收到重复序列号→ 判定为重放攻击直接拒绝序列号参与 MAC 计算攻击者无法简单复制旧密文反复重放3. 关于 AES-CBC 在 TLS 1.2 中的历史问题早期 TLS 1.2 的 AES-CBC 存在BEAST、Lucky Thirteen漏洞根源IV 复用、分组填充边界可被探测现代解决方案优先改用AES-GCM认证加密模式AEAD替代 CBCMAC 组合高版本客户端 / 服务端默认禁用 CBC 类密码套件4. TLS 1.3 与 TLS 1.2 的差异简化版TLS 1.3 大幅简化流程同时淘汰 CBC 模式握手轮次减少密钥派生逻辑简化彻底废弃 CBC 模式强制使用 AEAD 认证加密AES-GCM、ChaCha20-Poly1305不再单独区分加密密钥和 MAC 密钥AEAD 算法加密 完整性校验一体化每条记录使用独立随机 nonce替代 IV安全性更高六、极简总结串联 AES-CBC TLS 密钥使用TLS 握手结束通过密钥派生得到双向独立的 AES 密钥、IV、MAC 密钥发送数据明文分片 → 算 MAC → PKCS7 填充 →AES-CBC 加密使用当前方向 KeyIV→ 封装头部发送接收数据解头部 →AES-CBC 解密同组 KeyIV→ 去填充 → 校验 MAC 序列号核心逻辑对称密钥仅在同一条 TLS 会话内有效会话断开 / 重握手后会重新生成全套密钥。