# Sweet32（CVE-2016-2183）是什么？

> Sweet32 是 2016 年公布的生日攻击（CVE-2016-2183），针对 3DES 等 64 位分组密码的 CBC 模式，可从超长连接中还原 Cookie 等秘密。

Source: https://ssl.sh/zh/glossary/sweet32/
Last updated: 2026-11-10

Sweet32 由 Karthikeyan Bhargavan 和 Gaëtan Leurent 于 2016 年公布。分组长度为 64 位的密码，主要是 [3DES](https://ssl.sh/zh/glossary/3des/) 和 Blowfish，在 CBC 模式下按生日界大约加密 2^32 个分组（约 32 GB 数据）后就会开始出现密文块碰撞。一次碰撞会暴露两个明文块的异或值；如果其中一个已知、另一个包含反复出现的秘密（如 Cookie），攻击者就能把秘密还原出来。研究者通过保持单条连接并持续制造大量请求，分别演示了对使用 3DES 的 HTTPS 和使用 Blowfish 的 OpenVPN 的攻击。

## 为什么重要
攻击需要在一条连接上产生海量流量，实施并不容易，但它证明了 64 位分组密码已不适合今天的数据量。此后浏览器和 TLS 库的默认配置都逐步淘汰了 3DES，[TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/) 只允许 AEAD 算法，例如 [AES-GCM](https://ssl.sh/zh/glossary/aes-gcm/) 和 ChaCha20-Poly1305。服务器端的实际修复，就是把所有 3DES 套件（如 `TLS_RSA_WITH_3DES_EDE_CBC_SHA`）从密码套件列表中删掉。漏洞扫描或安全测评报告里出现 SWEET32 或 CVE-2016-2183 时，处理方式也是如此；Windows 服务器则需要在系统的密码套件设置中禁用 3DES。

## 例子
```bash
nmap --script ssl-enum-ciphers -p 443 example.com | grep -i 3des
```

没有输出说明未提供 3DES 套件。一个不含 3DES 的 Nginx 套件列表示例：

```nginx
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
```

## 常见误区
- **3DES 密钥够长，所以安全。** Sweet32 攻击的不是密钥，而是 64 位的分组长度，密钥再长也无济于事。
- **Sweet32 能很快解密任何 3DES 连接。** 它需要在单条连接上传输几十 GB 甚至更多数据；结论是淘汰 64 位分组密码，而不是所有短连接都已暴露。
- **去掉 3DES 会让现代客户端连不上。** 当前所有浏览器都支持 AES-GCM 或 ChaCha20-Poly1305，只有非常老的客户端依赖 3DES。

## 相关术语

- [3DES](https://ssl.sh/zh/glossary/3des/): 3DES 是把 DES 连续执行三次的分组密码，分组长度只有 64 位，主要因 Sweet32 攻击而在 TLS 中被视为应淘汰的旧算法。
- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [AES-GCM](https://ssl.sh/zh/glossary/aes-gcm/): AES-GCM 是以伽罗瓦/计数器模式运行的 AES 分组密码，属于 AEAD 算法，用计数器模式加密、用 GHASH 认证标签保证完整性。
- [ChaCha20-Poly1305](https://ssl.sh/zh/glossary/chacha20-poly1305/): ChaCha20-Poly1305 是把 ChaCha20 流密码与 Poly1305 认证算法组合而成的 AEAD 算法，专为纯软件实现时的高速和恒定时间而设计。
- [AEAD](https://ssl.sh/zh/glossary/aead/): AEAD 是带关联数据的认证加密算法，一次运算同时完成数据加密和完整性认证，并能保护不加密的附加数据不被篡改。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
