术语表

RC4 (Rivest Cipher 4)

最后核实

定义

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

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 等 CBC 攻击影响。RFC 7465 在 2015 年 2 月禁止 TLS 使用 RC4 套件,主流浏览器到 2016 年都已移除支持,TLS 1.3 中也没有 RC4。网上流传的旧版 Nginx 配置里偶尔还能看到把 RC4 排在前面的写法,照抄前应先核对。

例子

检查服务器是否还提供 RC4 套件:

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 算法中。

延伸阅读