# RC4（Rivest Cipher 4）是什么？

> RC4 是 Ron Rivest 在 1987 年设计的流密码，曾在 SSL/TLS 中广泛使用，因密钥流存在统计偏差，2015 年被 RFC 7465 禁止用于 TLS。

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

RC4 是一种流密码：用密钥生成伪随机密钥流，再与明文逐字节异或。它结构简单、速度快，曾大量用于 SSL、TLS 和早期的 Wi-Fi 加密。TLS 中常见的 RC4 套件有 RC4-SHA、RC4-MD5、ECDHE-RSA-RC4-SHA（OpenSSL 名称）。

## 为什么重要
RC4 的密钥流在统计上并不均匀，开头若干字节的偏差尤其明显。同一个秘密（例如 HTTP Cookie）被不同密钥反复加密时，攻击者可以借助这些偏差把它还原出来，2013 年和 2015 年公布的研究让这种攻击越来越实用。讽刺的是，2011 到 2013 年间很多网站特意把 RC4 调到最优先，因为作为流密码它不受 [BEAST](https://ssl.sh/zh/glossary/beast/) 等 CBC 攻击影响。[RFC 7465](https://www.rfc-editor.org/rfc/rfc7465) 在 2015 年 2 月禁止 TLS 使用 RC4 套件，主流浏览器到 2016 年都已移除支持，[TLS 1.3](https://ssl.sh/zh/glossary/tls-1-3/) 中也没有 RC4。网上流传的旧版 Nginx 配置里偶尔还能看到把 RC4 排在前面的写法，照抄前应先核对。

## 例子
检查服务器是否还提供 RC4 套件：

```bash
nmap --script ssl-enum-ciphers -p 443 example.com | grep -i rc4
```

没有任何输出才是正确结果。当前的 OpenSSL 默认不启用 RC4 套件，用新版 OpenSSL 编译的 Nginx 即使旧配置里写了 RC4 也协商不出来。

## 常见误区
- **RC4 不怕 CBC 攻击，所以安全。** 这是 BEAST 时期的权宜建议，后来证明 RC4 自身的偏差同样可被利用，协议标准已明确禁止。
- **128 位 RC4 和 128 位 AES 一样强。** 密钥流本身泄露信息时，密钥再长也无济于事。
- **流密码都有 RC4 那样的问题。** ChaCha20 等现代流密码没有类似偏差，并被用在 AEAD 算法中。

## 相关术语

- [密码套件](https://ssl.sh/zh/glossary/cipher-suite/): 密码套件是 TLS 客户端和服务器协商使用的一组命名的加密算法组合，例如 TLS_AES_128_GCM_SHA256，决定连接用什么算法保护数据。
- [SSL 3.0](https://ssl.sh/zh/glossary/ssl-3-0/): SSL 3.0 是 Netscape 设计的安全套接层协议的最后一个版本，1996 年发布，2014 年被 POODLE 攻破，2015 年被 RFC 7568 废弃。
- [BEAST](https://ssl.sh/zh/glossary/beast/): BEAST 是 2011 年公布的攻击（CVE-2011-3389），利用 SSL 3.0 和 TLS 1.0 中 CBC 模式可预测的 IV，逐字节解密 Cookie 等秘密。
- [TLS 1.0](https://ssl.sh/zh/glossary/tls-1-0/): TLS 1.0 是传输层安全协议的第一个版本，1999 年以 RFC 2246 发布，2021 年被 RFC 8996 正式废弃，主流浏览器已不再支持。
- [AEAD](https://ssl.sh/zh/glossary/aead/): AEAD 是带关联数据的认证加密算法，一次运算同时完成数据加密和完整性认证，并能保护不加密的附加数据不被篡改。
- [ChaCha20-Poly1305](https://ssl.sh/zh/glossary/chacha20-poly1305/): ChaCha20-Poly1305 是把 ChaCha20 流密码与 Poly1305 认证算法组合而成的 AEAD 算法，专为纯软件实现时的高速和恒定时间而设计。
