← RFC Reference

RFC 8463: 用于 DKIM 签名的 Ed25519

Standards Track Email Authentication Published March 2026
ELI5: DKIM 最初使用 RSA 密钥——与保护大多数网络的密钥类型相同。但 RSA 密钥体积庞大:2048 位公钥在 DNS TXT 记录中占用 400+ 个字符。Ed25519 是一种更新的、更精简的锁,强度相同,但密钥仅占用 44 个字符。更小的密钥、更快的验证、相同的信任——这就是 RFC 8463 为 DKIM 带来的内容。

为什么要这样做

DKIM (RFC 6376) 最初仅指定 RSA 用于签名。RSA 一直表现良好,但它也带来了成本:

Ed25519(使用 Curve25519 的 Edwards 曲线数字签名算法)解决了这三个问题。其 256 位密钥提供的安全性相当于大约 3072 位 RSA,公钥仅 32 字节(44 个 Base64 字符),验证速度明显更快。

工作原理

使用 Ed25519 签名

签名过程与标准 DKIM 相同,有两处变化:a= 标签使用 ed25519-sha256 而不是 rsa-sha256,私钥是 Ed25519 密钥而不是 RSA 密钥。

  1. 按 RFC 6376 规则规范化报头和正文。
  2. 计算规范化正文的 SHA-256 哈希(bh= 标签)。
  3. 计算已签名报头加正文哈希的 SHA-256 哈希。
  4. 使用 Ed25519 私钥签名报头哈希。
  5. 使用 a=ed25519-sha256 发送 DKIM-Signature 报头。

示例:Ed25519 DKIM-Signature

DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=example.com; s=ed202601; h=from:to:subject:date:message-id:mime-version:content-type; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=Tg2ByC4LSy9F1F6xAQchD8JFh6kYH7aKQjO6Sn7XIkfJVOzv8RBVOzv8QjO6S n7XIkfJV==

DNS 公钥记录

密钥记录使用 k=ed25519,公钥比 RSA 小得多:

; Ed25519 DKIM 密钥 — 注意 p= 值有多紧凑 ed202601._domainkey.example.com. IN TXT "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=" ; 与 RSA 2048 位密钥相比 — 大得多 rsa202601._domainkey.example.com. IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2UMfREvlgajdSp3jv1oI...已截断 (392 个字符)..."

双签名:推荐方法

还不是所有接收方都支持 Ed25519。RFC 8463 推荐双签名:对每条消息应用 RSA 签名和 Ed25519 签名。理解 Ed25519 的接收方可以验证更强的签名;不支持的接收方将降级到 RSA 签名。

; 具有两个 DKIM-Signature 报头的消息: DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=example.com; s=ed202601; h=from:to:subject:date:message-id; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=Tg2ByC4LSy9F1F6xAQchD8JFh6kYH7aK... DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=example.com; s=rsa202601; h=from:to:subject:date:message-id; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=LjIEJLNOTAREALh8gAiGVQOr3K7qO6Sn7XIkfJV...

两个签名共享相同的 bh=(正文哈希)和 h=(已签名报头)但使用指向 DNS 中不同密钥类型的不同选择器。

关键技术细节

密钥大小比较

属性 RSA-2048 Ed25519
安全级别(位) ~112 ~128
公钥大小 (Base64) ~392 个字符 44 个字符
签名大小 (Base64) ~344 个字符 88 个字符
签名速度 中等 快速
验证速度 快速 非常快速
DNS TXT 记录大小 紧凑,可能需要拆分 轻松适应单个字符串

密钥生成

# 使用 OpenSSL 1.1.1+ 生成 Ed25519 密钥对 openssl genpkey -algorithm Ed25519 -out ed25519_private.pem # 提取公钥 openssl pkey -in ed25519_private.pem -pubout -out ed25519_public.pem # 获取用于 DNS 的原始 Base64 公钥(剥离 PEM 报头) openssl pkey -in ed25519_private.pem -pubout -outform DER | tail -c 32 | base64 11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo= # 在 DNS 中发布为: # ed202601._domainkey.example.com. IN TXT "v=DKIM1; k=ed25519; p=11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo="

DNS 记录格式

与标准 DKIM 密钥记录相比的唯一变化是 k=ed25519。所有其他标签(v=、p=、t= 等)的工作方式与 RSA 密钥记录相同:

; 必需的标签 v=DKIM1 ; 版本(始终为 DKIM1) k=ed25519 ; 密钥类型(默认为 "rsa") p=<base64> ; 44 个字符的公钥 ; 可选标签(与 RSA 相同) t=s ; 严格模式:d= 必须完全匹配 From 域 t=y ; 测试模式:接收方不应将失败视为明确的

接收方行为

当接收方在 DKIM-Signature 中遇到 a=ed25519-sha256 时:

  1. 查找选择器的 DNS 密钥记录。
  2. 确认密钥记录中的 k=ed25519。
  3. 从 p= 标签解码 32 字节公钥。
  4. 针对规范化报头的 SHA-256 哈希验证 Ed25519 签名。

如果接收方不支持 Ed25519,则将签名视为无法验证(不是硬失败)并继续查看消息上的任何其他 DKIM-Signature 报头。

常见错误

可递送性影响

Related RFCs