算法协商机制基础

说到密码算法协商,我脑子里第一个蹦出来的场景就是:两台设备第一次握手,互相打量对方——"嘿,你支持什么算法?" "我支持这些,你呢?" 然后两边挑一个双方都认的算法,开始加密通信。

这个过程,说白了就是算法协商。它不是什么高深理论,而是网络通信中最务实的环节。没有它,两边各说各话,根本聊不到一块去。

什么是密码算法协商

密码算法协商,就是通信双方在建立安全通道之前,先交换各自支持的算法列表,然后从中选出一套双方都认可的组合。这套组合通常包括:

  • 密钥交换算法 —— 怎么安全地交换密钥材料
  • 认证算法 —— 怎么验证对方身份
  • 对称加密算法 —— 用什么算法加密数据
  • 消息认证码(MAC)算法 —— 怎么保证数据完整性
  • 哈希算法 —— 用于数字签名和密钥派生

我遇到过不少刚入行的同事,以为协商就是"选一个最强的算法"。其实不是。协商的核心是兼容性——在双方能力范围内,选一个安全级别最高的组合。

核心要点:算法协商不是"谁强听谁的",而是"双方都能接受的最优解"。这在PQC过渡期尤其重要——老设备可能只支持传统算法,新设备想用PQC,怎么兼容?协商机制就是答案。

TLS 1.3中的密码套件协商

TLS 1.3的协商机制,我个人觉得是这几个协议里最优雅的。它把密码套件(Cipher Suite)的数量从TLS 1.2的几十种砍到了5种。为什么?因为太多选择反而容易出配置错误。

在TLS 1.3中,协商过程大致是这样的:

  1. ClientHello:客户端发送支持的密码套件列表,以及密钥交换参数(比如ECDHE的公钥)
  2. ServerHello:服务端从列表里选一个套件,返回自己的密钥交换参数
  3. 密钥派生:双方用协商好的算法,结合交换的参数,派生出会话密钥
  4. Finished:互相验证握手消息的完整性

这里有个关键变化:TLS 1.3的密码套件只指定认证算法 + 对称加密算法 + 哈希算法,密钥交换算法是单独协商的。举个例子:

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256

你看,套件里没有"ECDHE"或者"RSA"这样的密钥交换标识。密钥交换算法是在扩展字段里协商的。这样做的好处是灵活——以后想加新的密钥交换算法,不用改密码套件定义。

实战经验:我在帮客户迁移到PQC时,TLS 1.3的扩展机制帮了大忙。我们只需要在ClientHello的扩展里加上PQC密钥交换算法的标识,服务端如果支持,就能直接协商。不需要改密码套件,也不需要升级整个TLS协议版本。

SSH中的密钥交换算法协商

SSH的协商方式和TLS不太一样。它更"直白"——双方先交换协议版本号,然后直接交换算法列表,逐项协商。

SSH的协商过程分为几个阶段:

  • TCP连接建立:客户端连接服务端的22端口
  • 协议版本交换:双方确认SSH协议版本(通常是2.0)
  • 算法列表交换:客户端和服务端各自发送支持的算法列表,包括密钥交换算法、主机密钥算法、对称加密算法、MAC算法、压缩算法
  • 密钥交换:用协商好的算法执行实际的密钥交换

SSH的算法列表是明文传输的。嗯,这里要注意——虽然列表是明文,但密钥交换过程本身是加密的。列表泄露不会直接导致安全问题,但攻击者可以知道双方支持哪些算法,从而针对弱算法发起降级攻击。

我曾经在一个项目中遇到过SSH协商失败的问题。原因是服务端配置了PQC密钥交换算法,但客户端不支持,而服务端又把传统算法全禁用了。结果两边找不到共同算法,连接直接断开。这个教训让我养成了一个习惯:在启用新算法时,一定要保留至少一个传统算法作为回退。

避坑指南:我曾经见过有人把SSH的KexAlgorithms配置成只支持一个实验性的PQC算法,结果所有客户端都连不上。SSH的协商是"必须找到共同算法才能继续",不像TLS可以优雅降级。所以配置SSH算法时,一定要留后路。

IPsec中的算法协商

IPsec的协商机制比TLS和SSH都复杂。它分两个阶段:

  • 阶段1(IKE_SA_INIT):协商IKE本身的安全参数,建立IKE SA
  • 阶段2(IKE_AUTH + CREATE_CHILD_SA):在IKE SA的保护下,协商IPsec SA的具体参数

IPsec的算法协商是通过安全关联(SA)来管理的。每个SA包含一组算法参数,比如:

参数 说明 常见选项
加密算法 保护数据机密性 AES-GCM, AES-CBC, ChaCha20
完整性算法 保护数据完整性 HMAC-SHA256, HMAC-SHA384
密钥交换算法 安全交换密钥材料 Diffie-Hellman, ECDH, PQC KEM
伪随机函数 用于密钥派生 PRF-HMAC-SHA256
DH群组 指定Diffie-Hellman的参数 Group 14, Group 19, Group 20

IPsec协商的一个特点是提议-响应机制。发起方可以发送多个提议(Proposal),每个提议包含一组算法组合。响应方从这些提议中选一个它最认可的。如果都不认可,协商失败。

我在做IPsec VPN迁移时,发现一个常见问题:很多设备默认只支持有限的DH群组。比如老设备只支持Group 2(1024位模数),这在今天已经不安全了。但如果你直接禁用Group 2,老设备就连不上了。我的做法是:在配置中保留Group 14(2048位)作为最低要求,同时启用更高强度的群组。

关键对比:

  • TLS 1.3:协商一次,密码套件精简,扩展机制灵活
  • SSH:逐项协商,算法列表明文交换,需要小心降级攻击
  • IPsec:两阶段协商,提议-响应机制,参数多且复杂

你想想看,这三种协议的协商机制,本质上都是在解决同一个问题:两个不知道对方能力的实体,如何安全地达成一致。只是各自的实现方式不同,复杂度也不同。

在PQC过渡期,理解这些协商机制的细节特别重要。因为你要在现有协议框架里,把PQC算法"塞"进去。有些协议好塞(比如TLS 1.3的扩展),有些协议难塞(比如IPsec的DH群组列表)。

下面这张图,我把三种协议的协商流程画在一起,方便你对比:

三种协议算法协商流程对比 TLS 1.3 协商 ClientHello (套件列表 + 扩展) ServerHello (选一个套件 + 参数) 密钥派生 + Finished SSH 协商 版本交换 (SSH-2.0) 算法列表交换 (明文) 逐项匹配 + 密钥交换 IPsec 协商 阶段1: IKE_SA_INIT 提议-响应 (多个Proposal) 阶段2: IKE_AUTH + SA协商 核心差异 TLS: 套件精简 + 扩展机制 | SSH: 逐项明文列表 | IPsec: 两阶段 + 提议-响应 PQC过渡期适配方式 • TLS 1.3: 在扩展字段中添加PQC密钥交换算法标识,无需修改密码套件 • SSH: 在密钥交换算法列表中加入PQC算法,但需保留传统算法作为回退 • IPsec: 在DH群组列表或KEM算法列表中增加PQC选项,注意兼容老设备

这张图把三种协议的协商流程放在一起对比。你可以看到,TLS 1.3最简洁,SSH最直白,IPsec最复杂。但不管哪种协议,核心逻辑都一样:先交换能力,再达成一致。

在PQC过渡期,我建议你重点关注两个问题:

  • 降级攻击:攻击者可能干扰协商过程,迫使双方使用弱算法。TLS 1.3通过"降级保护"机制解决了这个问题,但SSH和IPsec需要你自己配置防护
  • 兼容性回退:新算法不一定被所有设备支持。一定要保留至少一个传统算法作为回退,否则会出现"协商失败"的尴尬局面

嗯,算法协商机制就讲到这里。理解了这些基础,后面我们才能深入讨论如何在PQC过渡期设计安全的协商策略。