密码学预备知识:四位守护者

真要上手配置 TLS,你会发现绕不开四个老朋友——对称加密、非对称加密、哈希函数、消息认证码。这几个概念,每一项都在 TLS 握手中扮演着关键角色。

我刚开始搞安全时,总觉得这些理论离实战太远。直到有一次排查一个奇怪的握手失败问题,最终定位到是 GCM 模式的实现有 Bug……从那以后我才明白,理解这些基础,就是给自己省时省命。

咱们一个一个来看。


一、对称加密:速度之王

对称加密,说白了就是加密和解密用同一把密钥。速度快得惊人,适合加密大量数据。TLS 里的会话数据,最终都是靠对称加密来保护的。

目前主流的选择就两个:AES 和 ChaCha20。

AES(高级加密标准)

  • 密钥长度:128 位、192 位、256 位
  • 工作模式:GCM、CCM、CBC…… 但 TLS 1.3 只推荐 GCM
  • 硬件加速:现代 CPU 都有 AES-NI 指令,跑起来非常快

为什么 AES 这么普遍?因为它经过十几年的公开洗礼,安全性公认可靠。我自己的经验是,能选 AES-256-GCM 就别犹豫,性能开销几乎可以忽略。

提示:AES-GCM 是认证加密模式,加密的同时也完成完整性校验,省一个单独的 MAC 步骤。

ChaCha20

  • 密钥长度:256 位
  • 配合:Poly1305 做消息认证
  • 优势:软件实现极快,尤其适合没有 AES 硬件加速的移动设备

ChaCha20-Poly1305 是一个绝妙的组合。我记得 Google 在 Android 设备上测试过,它的性能比 AES-GCM 还要好。如果你的终端用户很多是老设备,ChaCha20 可能是更保守的选择。

特性 AES-256-GCM ChaCha20-Poly1305
密钥长度 256 位 256 位
硬件加速 支持(AES-NI) 无专用硬件加速
软件性能 一般 优秀
安全审计 十余年 约 8 年
TLS 1.3 推荐 是 是
避坑:我曾经见过有人用 AES-CBC 配合 HMAC,想实现同样的效果。结果因实现细节出错,导致整个会话被破解。直接用 GCM 模式,省心省力。

二、非对称加密:钥匙交换的基石

非对称加密用一对密钥:公钥加密,私钥解密。速度慢,但解决了密钥分发这个世纪难题。

在 TLS 里,它主要干两件事:身份认证和密钥交换。

RSA(经典但正在老化)

  • 密钥长度:2048 位起步,现在推荐 3072/4096 位
  • 用途:签名和密钥传输
  • 问题:不支持前向安全性

为什么要说前向安全性?假如今天你的私钥泄露了,攻击者可以解开以前所有录制的加密流量。这很要命。

所以我现在几乎不在密钥交换阶段用 RSA。ECDHE 才是正道。

ECDHE(椭圆曲线 Diffie-Hellman 临时密钥)

  • 曲线:X25519、P-256、P-384、P-521
  • 核心优势:每次握手生成临时密钥对,即使长期私钥泄露,也解不开历史的流量
  • 性能:比 RSA 快几个数量级

ECDHE + 签名算法是现代 TLS 的标准配置。我个人习惯用 ECDHE-ECDSA 的组合,比起 ECDHE-RSA,证书链少一次验证开销,双方都省事。

核心建议:密钥交换请优先使用 ECDHE,曲线至少选 X25519 或 P-256。签名算法随证书走,但 ECDSA 比 RSA 更高效。

三、哈希函数:数据的指纹

哈希函数能把任意长度的数据,压缩成固定长度的摘要。不可逆,且任何微小改动都会让结果面目全非。

TLS 用它来保证数据的完整性——如果有人篡改了数据,哈希值一比较立刻现形。

SHA-2(当前主流)

  • 变体:SHA-224、SHA-256、SHA-384、SHA-512
  • 安全强度:SHA-256 及以上被认为是安全的
  • 性能:64 位平台上 SHA-512 比 SHA-256 还要快,因为它在 64 位字长上运算

嗯,这里有个小技巧。如果你部署的服务器是 x64 架构,用 SHA-512 签名证书或做 HMAC 反而比 SHA-256 快,资源消耗却差不多。

SHA-3(新兴选手)

  • 设计:基于 Keccak 海绵结构,与 SHA-2 完全不同
  • 安全性:理论上抗碰撞能力更强
  • 实际应用:TLS 1.3 未强制要求,目前支持度有限

我在项目中还不怎么用 SHA-3 签证书,因为 CA 那边支持率太低。但在内部校验、固件签名里用 SHA-3 感受过,真的很稳。

算法 输出长度 安全性 TLS 使用
SHA-256 256 位 高 广泛
SHA-384 384 位 高 广泛
SHA-512 512 位 极高 较少
SHA3-256 256 位 高 实验中

四、消息认证码(MAC):双重保险

想象一下,数据在传输过程中被中间人截获,改了内容再发给你。你收到后,用哈希函数验证,发现摘要不一样,就知道出问题了。

消息认证码(MAC)干了同样的事,但多了一个密钥。只有持有密钥的双方,才能计算出正确的 MAC 值。

这样一来,攻击者即使能篡改数据,也造不出有效的 MAC——因为没有密钥。

HMAC(最常用的 MAC)

  • 构造:HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
  • 依赖:底层哈希函数(通常用 SHA-256 或 SHA-384)
  • 场景:TLS 1.2 中的记录层完整性

你可能会问:为什么要套这么复杂?直接用哈希函数加个密钥不就行了吗?

嗯,不行。简单的拼接方式有很多已知攻击,比如长度扩展攻击。HMAC 的设计专门防止这类问题,是经过验证的保险方案。

提示:在 TLS 1.3 里,HMAC 被集成到了 AEAD 模式中。GCM 和 ChaCha20-Poly1305 都自带认证标签,所以不需要单独配置 HMAC。但这不意味着你不需要理解它——很多底层调试场景下,你还是会碰到它。

知识结构总览

这几个概念串起来,就构成了 TLS 安全基石的完整拼图。下面这张图帮你理清脉络:

密码学四大核心 对称加密 AES-256-GCM ChaCha20-Poly1305 非对称加密 ECDHE(密钥交换) RSA/ECDSA(签名) 哈希函数 SHA-256 / SHA-384 / SHA-512 SHA3-256 消息认证码 HMAC-SHA256 三者如何协作? 1. ECDHE 交换对称密钥(非对称加密) 2. 对称加密算法用该密钥加密会话数据(对称加密) 3. 哈希函数 + MAC(或 AEAD 标签)校验数据完整性 4. 数字签名(基于哈希)完成身份认证

你想想看,这四个东西串起来,才构成一条完整的 TLS 安全链路。任何一个薄弱,整个连接都是纸糊的。


实战小结

  1. 对称加密:AES-256-GCM 是首选,ChaCha20-Poly1305 适合没有硬件加速的场景
  2. 非对称加密:ECDHE 做密钥交换,ECDSA 或 RSA 做签名——别用 RSA 加密密钥
  3. 哈希:SHA-256 就够用,SHA-384 在特定场景下比 SHA-256 更优雅
  4. MAC:TLS 1.3 用 AEAD 搞定,但你看到 HMAC 别慌——它只是被封装了
避坑指南:我曾经遇到一个案例,工程师配了一套密码套件,里面带了 RSA 密钥交换。他以为只是签名用,结果 ECDHE 没生效,整个握手用的 RSA 加密。私钥一泄露,所有历史流量一夜归零。别让这种坑发生在你身上。