# CRIME是什么？定义、例子与常见误区

> CRIME 是 2012 年公布的攻击（CVE-2012-4929），通过观察 TLS 层压缩对密文长度的影响，从加密连接中还原 Cookie 等秘密。

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

CRIME 由提出 [BEAST](https://ssl.sh/zh/glossary/beast/) 的 Juliano Rizzo 和 Thai Duong 于 2012 年公布。TLS 在加密前先压缩数据时（TLS 1.2 及更早版本可以协商 DEFLATE 压缩），每条加密记录的长度取决于内容的压缩效果。攻击者若能让浏览器发送包含自选文本、且与秘密（例如同一组请求头里的 Cookie）放在一起的请求，并能观察加密后的长度，就可以逐字节猜测秘密：猜对时内容出现重复，压缩后会略短一点。SPDY 的头部压缩也存在同样的问题。

## 为什么重要
应对方式很直接：浏览器关闭了 TLS 压缩，服务器端的库随后跟进，[TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/) 则彻底取消了压缩。HTTP/2 用 HPACK 取代了 SPDY 的头部压缩，HPACK 在设计时就考虑了这种攻击。它留下的教训是：把秘密和攻击者可控的数据一起压缩再加密，长度本身就会泄露信息。2013 年的 BREACH 把同样的思路用到了 HTTP 响应压缩（如 gzip）上，这无法靠 TLS 配置解决，需要在应用层缓解，例如每次请求对 CSRF token 做随机掩码，或不压缩那些同时反射用户输入和包含秘密的响应。

## 例子
```bash
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | grep -i '^Compression'
# Compression: NONE
```

## 常见误区
- **在 Nginx 里关掉 gzip 就能修复 CRIME。** CRIME 针对的是 TLS 层压缩，现行的库早已禁用；gzip 关系到的是另一种攻击 BREACH。
- **因为 CRIME 应该避免使用 HTTP/2。** HTTP/2 的 HPACK 头部压缩在设计时就专门防范了这类攻击。
- **加密会隐藏数据的大小。** TLS 隐藏的是内容而不是长度，CRIME 和 BREACH 利用的正是这一点。

## 相关术语

- [BEAST](https://ssl.sh/zh/glossary/beast/): BEAST 是 2011 年公布的攻击（CVE-2011-3389），利用 SSL 3.0 和 TLS 1.0 中 CBC 模式可预测的 IV，逐字节解密 Cookie 等秘密。
- [TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/): TLS 1.3 是当前最新的传输层安全协议版本（2018 年的 RFC 8446，现行规范为 RFC 9846），完整握手只需一个往返，且只保留 AEAD 加密算法。
- [TLS 1.2](https://ssl.sh/zh/glossary/tls-1-2/): TLS 1.2 是 2008 年由 RFC 5246 定义的 TLS 版本，引入了基于 SHA-256 的密钥派生和 AES-GCM 等 AEAD 加密算法，至今仍被广泛使用。
- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [中间人攻击](https://ssl.sh/zh/glossary/man-in-the-middle/): 中间人攻击是指攻击者暗中插入通信双方之间，转发并可能篡改流量，而双方都以为自己在直接和对方通信。
