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

注意事项

  1. 兼容性:老版本的 OpenSSH(< 6.5)和某些嵌入式设备不支持 Ed25519
  2. 证书格式:OpenSSL 生成的 PEM 格式与 OpenSSH 格式不同,需要转换时使用 ssh-keygen -issh-keygen -e
  3. HSM 支持:部分硬件安全模块对 Ed25519 支持有限

参考资料