术语表

AES-GCM (伽罗瓦/计数器模式的 AES)

最后核实

定义

AES-GCM 是以伽罗瓦/计数器模式运行的 AES 分组密码,属于 AEAD 算法,用计数器模式加密、用 GHASH 认证标签保证完整性。

AES-GCM 把 AES 的计数器模式(把分组密码变成密钥流)和 GHASH(一种在二元域上的多项式认证算法)组合在一起,输出密文和 128 位认证标签。它由 NIST SP 800-38D 规定,是一种 AEAD 算法。TLS 中使用 128 位或 256 位 AES 密钥和 96 位 nonce:TLS 1.2 有 ECDHE-RSA-AES128-GCM-SHA256 等套件,TLS 1.3 有 TLS_AES_128_GCM_SHA256 和 TLS_AES_256_GCM_SHA384。

为什么重要

AES-GCM 是服务器和桌面浏览器之间最常协商出的 TLS 加密算法。现代 x86 和 ARMv8 处理器都带有专门的 AES 指令和无进位乘法指令,用它们实现的 AES-GCM 速度很快,也能抵御缓存时序攻击。没有这类硬件的处理器上,软件 AES 既慢又难以做到恒定时间,所以服务器通常同时提供 ChaCha20-Poly1305 供这类客户端选择。云服务器选型时,CPU 是否支持 AES 指令会直接影响 HTTPS 的加解密开销。

例子

在服务器上测一下 AES-GCM 的性能,并对照 TLS 中的套件名称:

openssl speed -evp aes-128-gcm
openssl speed -evp aes-256-gcm
TLS 1.3: TLS_AES_128_GCM_SHA256, TLS_AES_256_GCM_SHA384
TLS 1.2: ECDHE-ECDSA-AES128-GCM-SHA256, ECDHE-RSA-AES256-GCM-SHA384

常见误区

  • 只有 AES-256-GCM 才够安全。 AES-128 提供 128 位安全强度,正是 TLS 通常追求的水平;选 AES-256 多是出于合规要求或更长远的安全余量,代价是略慢。
  • GCM 的 nonce 偶尔重复没关系。 同一密钥下重复 nonce 会泄露两段明文的异或值,还能让攻击者伪造认证标签。TLS 用记录序号派生 nonce,正确实现不会出现重复。
  • 用了 AES-GCM 就有前向保密。 前向保密取决于密钥交换,AES128-GCM-SHA256 这个套件使用静态 RSA 密钥传输,并不具备前向保密。

延伸阅读