加密、哈希、HMAC、签名和随机数只是零件。安全协议规定参与者以什么顺序发送哪些消息、验证什么状态,以及失败时怎样终止。即使每个零件都可靠,漏掉身份绑定、新鲜性或握手完整性,仍会产生重放和中间人风险。

学完这部分的内容后,你应能解释消息认证、挑战—响应、nonce 和序列号;推导 Diffie-Hellman 并指出 MITM 根因;描述 TLS/HTTPS 与 SSH 的信道建立;解释 Kerberos 票据、X.509 证书和 PKI 生命周期;能从身份、机密性、完整性、新鲜性和失败处理五个维度审查握手。
协议分析不能只问“用了什么算法”,还要问:密钥属于谁?本轮消息是否新鲜?协商参数是否被认证?每个参与方确认的会话是否相同?错误会不会泄露秘密或降级到弱模式?
机密性防窃听,消息认证则确认内容未改且来自持有正确密钥的一方。HMAC 把密钥、消息和哈希结构结合,接收者重算并以恒定时间比较标签。签名还能让不共享秘密的验证者检查公钥对应私钥的持有者。
挑战—响应中,验证者生成不可预测的 nonce;证明者对“协议标识、双方身份、nonce、请求动作”等完整上下文计算 HMAC 或签名;验证者检查标签和 nonce 状态。秘密不在网络上传输,旧响应也不能用于新挑战。
防重放有三类常见状态:时间戳需要可靠时钟与接受窗口;序列号适合持久连接并配合滑动窗口;nonce 不需时钟,但必须足够随机、不可重复,并记录已使用状态或绑定短期事务。只给消息加密或 HMAC 并不自动防重放,因为原封不动的旧密文仍可能通过完整性检查。
在公开参数 p、g 下,甲选择私有 a 并发送 A=g^a mod p,乙选择私有 b 并发送 B=g^b mod p。甲算 B^a mod p,乙算 A^b mod p,结果都是 g^(ab) mod p。旁观者看到公开值,却难以恢复私有指数。

DH 只解决“共享一个秘密”,没有证明公开值是谁发的。主动中间人可把 A、B 替换为自己的公开值,与两边分别建立 K1、K2,解密后再转发。修复方法是把双方身份、公开值、随机数和协商参数一起签名或 HMAC,并验证证书链或预共享密钥。临时 ECDHE 每次会话使用新私钥,长期私钥日后泄露时,历史会话密钥也较难恢复,这就是前向保密。
真实小参数演示输出如下,数值仅用于理解等式,不能用于生产:
DH: p=23, g=5, A=8, B=19, 甲的密钥=2, 乙的密钥=2TLS 位于应用协议与传输连接之间。客户端问候携带版本、密码套件、随机数和密钥份额;服务器选择参数并提供证书和密钥份额;客户端验证证书的信任链、名称、有效期、用途与状态;双方从共享秘密和握手 transcript 派生方向不同的密钥;Finished 消息认证此前全部握手,随后记录层为应用数据提供机密性和完整性。

HTTPS 不是另一套加密算法,而是 HTTP 运行在 TLS 保护中。TLS 能保护传输内容和对端身份,却不能保证服务器业务逻辑无漏洞,也不能隐藏所有流量元数据。证书名称不匹配、过期、用途错误或链无法抵达本地信任锚时,应失败关闭;不能让用户随意点击继续。
会话恢复减少往返,但恢复凭据仍需绑定服务器、参数与有效期。连接关闭也应使用协议告警,避免截断攻击把不完整响应误当完整结果。
SSH 也先协商算法和临时会话密钥,但服务器身份通常由长期主机密钥证明。客户端把主机公钥或证书与 known_hosts、DNSSEC 辅助记录或人工核对的指纹比较。首次连接时若不核对指纹,“接受并保存”只是在记住当前连接者,无法排除首次即遭中间人。
主机确认后,用户再以公钥签名、证书或密码认证。公钥登录不是“把私钥发给服务器”,而是客户端用私钥对会话绑定数据签名,服务器用 authorized_keys 中的公钥验证。SSH 最终为终端、文件传输和端口转发提供加密与完整性;端口转发会扩展信任边界,应按用户和目标限制。
主机密钥轮换要通过多密钥过渡或可信分发更新,不能训练用户忽略“主机标识已改变”的高风险警告。
Kerberos 让客户端、认证服务 AS、票据服务 TGS 与应用服务协作。用户登录后向 AS 获取票据授予票据 TGT 和会话密钥;客户端用 TGT 加新鲜认证器向 TGS 换取特定服务票据;再把服务票据和另一个认证器交给应用。密码本身不在网络上传输。

票据由相应服务器的长期密钥保护,可以在有效期内重复使用;认证器包含身份、地址或时间信息,由会话密钥保护且寿命很短。两者组合防止只盗得票据的人长期重放。服务返回经会话密钥保护的递增时间值,可实现双向认证。
Kerberos 依赖时钟同步、KDC 可用性和长期密钥安全。跨 realm 认证还引入域间信任:一方接受另一方 KDC 对用户身份的判断,因此信任路径和名称约束必须明确。
X.509 证书把主体名称与公钥绑定,并包含版本、序列号、签发者、有效期、主体、公钥算法与参数、扩展和签名。验证者不是只验最后一张证书签名,而是构造到本地信任锚的路径,逐级检查签名、时间、基础约束、名称约束、密钥用途,并确认终端证书名称匹配目标服务。
PKI 还包括注册、证书签发、存储与分发、密钥更新、恢复策略、吊销请求、CRL/OCSP 状态和跨认证。私钥泄露、主体离职或名称变化时,等待证书自然过期可能太慢,必须支持吊销。信任锚的安装是关键初始化步骤:若根公钥被错误植入,再完美的链验证也会信任错误对象。
这里我们用沙盒环境使用同一 nonce 两次。HMAC 标签两次完全相同,证明完整性校验本身不会识别重放;服务器记录 nonce 后,第二次才被拒绝。
HMAC 第1次: nonce=fixed-demo-nonce, tag=fe16b3428f0566317df23b46, 结果=接受
HMAC 第2次: nonce=fixed-demo-nonce, tag=fe16b3428f0566317df23b46, 结果=拒绝重放随后在临时目录生成仅供本机检查的两天期自签证书,并读取身份、有效期和 SHA-256 指纹:
subject=CN = security-lab.local, O = WeLearn Lab
issuer=CN = security-lab.local, O = WeLearn Lab
notBefore=Jul 13 02:29:31 2026 GMT
notAfter=Jul 15 02:29:31 2026 GMT
sha256 Fingerprint=E8:DE:70:FB:7C:23:5C:5B:34:70:7C:7B:87:1D:22:E1:BE:43:83:E2:EA:1F:91:36:EE:C5:F1:B8:64:C5:34:98subject 与 issuer 相同说明它是自签对象;这不等于外部客户端会信任它。只有显式加入本地信任锚且名称、用途、时间和策略都通过,验证才成立。实验没有连接或攻击任何外部目标,临时私钥和证书在输出后删除。
挑战—响应用新鲜随机数避免发送秘密;DH 协商共享秘密但必须认证公开值;TLS 用证书、临时密钥协商和握手 transcript 建立 HTTPS 信道;SSH 以主机密钥先确认服务器,再认证用户;Kerberos 用可信第三方、票据和短期认证器实现单点登录;X.509 与 PKI 管理公钥身份和完整生命周期。
审查协议时依次确认:安全目标是否明确;每个密钥的归属与用途是否分离;随机数是否不可预测且不复用;身份、角色和协商参数是否全部绑定;是否抵抗重放、反射、MITM 与降级;证书和票据是否检查期限与状态;错误是否失败关闭;密钥能否轮换、吊销和安全销毁;日志是否足以关联一次完整会话。