Poly1305 是什么
Poly1305 是 RFC 8439 定义的一次性认证码(one-time MAC):使用 32 字节密钥对消息计算 16 字节标签,验证方用同一密钥重算并比对。它的核心运算是在素数 2^130-5 上做多项式求值,实现简洁、速度快,且不依赖查表,天然适合恒定时间实现。最常见的形态是与 ChaCha20 组合成 ChaCha20-Poly1305 这类 AEAD 算法,用于 TLS 1.3、WireGuard、SSH 等协议。
基本信息
| 标准 | RFC 8439 §2.5 |
|---|---|
| 密钥 | 32 字节,每条消息一次性使用 |
| 标签 | 16 字节(128 位) |
| 常见组合 | ChaCha20-Poly1305(AEAD) |
| 能力边界 | 只提供完整性与认证,不单独提供机密性 |
| 性能特点 | 无查表运算,软件实现快且不易受缓存计时攻击影响 |
典型使用场景
- TLS 1.3 的 ChaCha20-Poly1305 套件:缺少 AES 硬件加速的移动与嵌入式设备首选
- WireGuard 等 VPN 协议的报文加密与认证
- 需要恒定时间软件实现的场景:避免 AES 查表带来的缓存计时侧信道
- 受限终端上的 AEAD:无 AES 指令集时纯软件效率明显好于 AES-GCM
- 作为 AEAD 构造的一部分使用,nonce 与密钥派生交给上层协议管理
示例与要点
示例与要点
# Python(cryptography):一次性密钥生成与标签校验
from cryptography.hazmat.primitives.poly1305 import Poly1305
import os
key = os.urandom(32) # 每条消息一个新密钥
tag = Poly1305.generate_tag(key, b'message') # 生成 16 字节标签
Poly1305.verify_tag(key, b'message', tag) # 校验失败抛 InvalidSignature
# 实际使用:不要手工生成密钥,按 RFC 8439 从会话密钥派生
# ChaCha20-Poly1305 的 32 字节 one-time key 由 ChaCha20 对 nonce 加密得到与通用 MAC 的差别
| 对比项 | Poly1305 | HMAC-SHA256 |
|---|---|---|
| 密钥复用 | 严禁,每条消息一次性 | 允许长期复用 |
| 速度 | 极快,无查表 | 依赖哈希实现,通常较慢 |
| 密钥长度 | 32 字节 | 任意长度 |
| 典型定位 | AEAD 内部认证件 | 通用消息认证 |
密钥复用是致命错误:同一密钥认证两条不同消息会泄漏密钥材料,攻击者可以直接伪造后续标签。组合使用时密钥必须按 RFC 8439 的规则派生,不能直接用约定字符串或固定值。
选择建议:桌面与服务器通常具备 AES 硬件加速,AES-GCM 更快;手机、家用路由与缺少 AES 指令集的老设备上,ChaCha20-Poly1305 的纯软件性能明显更好。两者都属于当前推荐集合,按客户端能力择优即可。