Ed25519 是一种基于 EdDSA(Edwards-curve Digital Signature Algorithm)的数字签名算法,使用 Curve25519 椭圆曲线的变形 Ed25519。相比传统的 RSA 和 ECDSA,Ed25519 在安全性、性能和易用性上都有显著优势,已成为现代密码学的首选签名算法之一。
Ed25519 的核心优势#
1. 密钥体积小#
Ed25519 的密钥非常紧凑,公钥仅 32 字节,私钥 32 字节(种子)。这相比 RSA 2048 的 256 字节公钥和 1700+ 字节的私钥,存储和传输成本大幅降低。
公钥长度对比:
1
2
3
|
Ed25519 公钥: 82 字节(Base64 编码后)
RSA 2048 公钥: 382 字节(Base64 编码后)
ECDSA P-256 公钥: 162 字节(Base64 编码后)
|
2. 签名速度快#
Ed25519 的签名和验证速度都非常快。其设计充分利用了现代 CPU 的特性,比 ECDSA 快约 3-5 倍,比 RSA 快得多。
3. 安全性高#
- 128 位安全强度:等效于 RSA 3072 位或 AES-128
- 抗侧信道攻击:实现设计避免了时序攻击等侧信道风险
- 确定性签名:不需要随机数生成器,避免了 ECDSA 的随机数重用漏洞
4. 无专利限制#
Ed25519 基于公开的数学研究,无专利限制,可以自由实现和使用。
生成 Ed25519 密钥#
使用 ssh-keygen 生成 SSH 密钥#
1
|
ssh-keygen -t ed25519 -C "your_email@example.com"
|
输出示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
Generating public/private ed25519 key pair.
Enter file in which to save the key (/root/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your identification has been saved in /root/.ssh/id_ed25519
Your public key has been saved in /root/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:B+fiOUBiCVwk/pTqzQkNKYRZAfjtCXuaN7YWdcbGPx4 your_email@example.com
The key's randomart image is:
+--[ED25519 256]--+
|+*=+o |
|=..+ o |
|..+.* .o. . |
| .oB.o. *+ |
| o+oo.+S.o |
| ..+=. o +E |
| .++. +. o |
| o = .. |
| +.o |
+----[SHA256]-----+
|
参数说明:
| 参数 |
说明 |
-t ed25519 |
指定密钥类型为 Ed25519 |
-C |
添加注释(通常为邮箱或用途描述) |
-f |
指定保存路径(可选) |
-N |
直接设置密码短语(适合脚本) |
使用 OpenSSL 生成密钥#
OpenSSL 3.0+ 支持 Ed25519 密钥生成:
1
2
3
4
5
6
7
8
|
# 生成私钥
openssl genpkey -algorithm ED25519 -out ed25519_private.pem
# 提取公钥
openssl pkey -in ed25519_private.pem -pubout -out ed25519_public.pem
# 查看密钥信息
openssl pkey -in ed25519_private.pem -text -noout
|
输出示例:
1
2
3
4
5
6
7
8
9
|
ED25519 Private-Key:
priv:
89:3f:6a:f7:f9:1d:33:ad:59:36:1a:34:b8:61:2f:
43:b4:e1:b3:70:00:86:30:76:af:22:3b:04:14:1b:
8f:5b
pub:
f2:d4:71:7d:fc:d5:d0:35:89:17:3a:8f:09:c7:85:
4b:7b:bc:27:e6:28:7e:ee:6d:4e:cc:81:f3:ad:e1:
56:90
|
Ed25519 与其他算法对比#
| 特性 |
Ed25519 |
ECDSA P-256 |
RSA 2048 |
| 公钥大小 |
32 字节 |
64 字节 |
256 字节 |
| 私钥大小 |
32 字节 |
32 字节 |
~1700 字节 |
| 签名大小 |
64 字节 |
64 字节 |
256 字节 |
| 签名速度 |
快 |
中等 |
慢 |
| 验证速度 |
快 |
快 |
中等 |
| 安全强度 |
128 位 |
128 位 |
~112 位 |
| 随机数需求 |
无 |
需要高质量随机数 |
需要填充 |
| 实现复杂度 |
低 |
高 |
中等 |
何时选择 Ed25519#
- SSH 认证:OpenSSH 6.5+ 默认推荐
- 代码签名:Git 提交签名、软件包签名
- 证书签发:内部 PKI、自签名证书
- 区块链应用:许多现代区块链采用 Ed25519
何时考虑其他算法#
- 需要广泛兼容性:RSA 证书仍被所有系统支持
- 合规要求:某些标准要求特定算法
- 硬件限制:老旧设备可能不支持 Ed25519
实际应用场景#
SSH 密钥管理#
1
2
3
4
5
6
7
8
|
# 生成用于 GitHub/GitLab 的 SSH 密钥
ssh-keygen -t ed25519 -C "github" -f ~/.ssh/github_ed25519
# 添加到 SSH agent
ssh-add ~/.ssh/github_ed25519
# 查看公钥(用于添加到服务端)
cat ~/.ssh/github_ed25519.pub
|
Git 提交签名#
1
2
3
4
5
6
7
|
# 配置 Git 使用 Ed25519 签名
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
# 签名提交
git commit -S -m "Signed commit message"
|
服务器 SSH 加固#
在 /etc/ssh/sshd_config 中限制只接受 Ed25519 密钥:
1
2
3
4
5
|
# 禁用 RSA 和 ECDSA
PubkeyAcceptedAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com
# 重启 SSH 服务
sudo systemctl reload sshd
|
注意事项#
- 兼容性:老版本的 OpenSSH(< 6.5)和某些嵌入式设备不支持 Ed25519
- 证书格式:OpenSSL 生成的 PEM 格式与 OpenSSH 格式不同,需要转换时使用
ssh-keygen -i 和 ssh-keygen -e
- HSM 支持:部分硬件安全模块对 Ed25519 支持有限
参考资料#