使用 Ed25519 实现数字签名
概述
Ed25519 是一种使用 Edwards 曲线 Curve25519 的高性能数字签名(digital signature)算法。它以 64 字节签名和 32 字节密钥提供 128 位安全性,相比 RSA 和 ECDSA 具有显著优势,包括确定性签名(无需随机 nonce)、抗侧信道攻击以及快速验证。本技能涵盖为文档签名、代码签名和 API 认证实现 Ed25519。
目标
- 生成用于签名的 Ed25519 密钥对
- 使用 Ed25519 对消息和文件签名
- 对照公钥验证签名
- 实现多签名验证
- 构建简单的代码签名系统
- 比较 Ed25519 与 RSA 和 ECDSA 的性能
核心概念
Ed25519 vs RSA vs ECDSA
| 属性 | Ed25519 | RSA-3072 | ECDSA P-256 |
|---|---|---|---|
| 安全性 | 128 位 | 128 位 | 128 位 |
| 公钥大小 | 32 字节 | 384 字节 | 64 字节 |
| 签名大小 | 64 字节 | 384 字节 | 64 字节 |
| 密钥生成 | ~50 us | ~100 ms | ~1 ms |
| 签名 | ~70 us | ~5 ms | ~200 us |
| 验证 | ~200 us | ~200 us | ~500 us |
| 确定性 | 是 | 否 (PSS) | 否(除非 RFC 6979) |
关键特性
- 确定性(Deterministic):相同消息 + 密钥始终产生相同签名
- 抗碰撞(Collision-resistant):无需单独的哈希函数
- 抗侧信道(Side-channel resistant):恒定时间实现
- 小密钥:公钥和私钥各 32 字节
安全注意事项
- Ed25519 不支持从签名中恢复密钥
- 验证完整消息,而非哈希值(Ed25519 内部进行哈希)
- 使用前必须验证公钥(检查低阶点)
- 私钥在静止状态下应加密存储
- Ed25519 尚未获批用于所有 NIST 用例(联邦场景首选 Ed448)
验证标准
- 密钥对生成产生有效的 Ed25519 密钥
- 对有效消息的签名验证成功
- 对篡改消息的签名验证失败
- 对错误公钥的签名验证失败
- 确定性:相同输入产生相同签名
- 文件签名和验证工作正常
- 性能达到或超过 RSA-3072