DKIM 签名
使用密码学为消息签名。
DKIM 签名 是 CoddyKit 上的免费 Cyber Security Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cyber Security Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cyber Security Academy 课程共包含 4 节课。
DKIM 提供的功能
DKIM(DomainKeys 标识邮件)会为发出的邮件附加加密签名。接收方可以验证该签名,以确认以下两点:
- 邮件确实获得了签名域名的授权
- 签名所覆盖的内容在传输过程中未被修改
SPF 为服务器提供授权,而 DKIM 验证的是邮件本身,并且该签名能够经受转发。
公钥密码学基础
DKIM 依赖非对称密码学。域名所有者持有一对 key:
- 私有 key会保密存放在发送邮件服务器上,用于签名
- 公有 key会发布到 DNS 中,供任何人验证
由于只有持有私有 key 的一方才能生成有效签名,因此验证成功即可证明邮件来自合法域名。
签名过程
发送服务器发送邮件时,会根据选定的标头和正文计算签名,然后添加 DKIM-签名标头。
Steps on the sender side:
1. Select headers to sign (From, Subject, Date, ...)
2. Hash the message body
3. Build the DKIM-Signature header with those fields
4. Sign the hash with the private key
5. Attach the signature to the outgoing messageDKIM-签名标头的组成
DKIM-签名标头携带接收方进行验证所需的参数:
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=company.com; domain that signed
s=mail2024; selector (which key)
h=from:subject:date; signed headers
bh=base64bodyhash; body hash
b=base64signature the signature itselfDNS 中的选择器与公有 key
选择器(s= 标记)会告诉接收方应获取哪个公有 key。该 key 位于一个可预测的 DNS 位置:
Location: <selector>._domainkey.<domain>
Example DNS TXT record:
mail2024._domainkey.company.com. IN TXT \
"v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBA..."
p = the base64-encoded public key验证过程
收到邮件后,验证服务器会反向执行这一过程:
- 从 DKIM-签名中读取
d=域名和s=选择器 - 从 DNS 中的
selector._domainkey.domain获取公有 key - 重新计算正文哈希和标头哈希
- 使用公有 key 验证签名是否匹配
如果签名有效,DKIM 检查通过。如果邮件被修改,或签名使用了错误的 key,则检查失败。
正文哈希可检测篡改
bh(正文哈希)字段使 DKIM 能够发现篡改。发送方会对正文进行哈希计算,并将该哈希包含在签名数据中。
如果有人在传输过程中修改邮件正文,接收方重新计算的哈希就不会与已签名的 bh 匹配,验证也会失败。DKIM 正是通过这种方式提供完整性,而不仅仅是来源验证。
规范化
传输途中的邮件服务器经常会进行细微且无害的更改,例如重新换行或调整空白。为避免这些更改破坏有效签名,DKIM 使用规范化(c= 标记)。
- 简单——严格模式;几乎任何更改都会破坏签名
- 宽松——允许空白和标头大小写发生更改
为了适应多样化的邮件基础设施,大多数部署会使用 relaxed/relaxed,以提高可靠性。
选择器支持 key 轮换
选择器不只是标签,还支持安全的key 轮换。您应定期替换 DKIM key,以便在某个 key 泄露时限制风险。
轮换过程:
- 使用新的选择器生成一对新的 key(例如
mail2025) - 在 DNS 中发布新的公有 key
- 切换签名方,使其使用新的选择器
- 将旧选择器保留在 DNS 中,直到传输中的邮件完成投递,然后将其移除
使用新的选择器可以避免出现无法验证签名的空档期。
DKIM 经得住转发
与 SPF 不同,DKIM经得住转发。签名会随邮件一起传递,因此只要已签名的标头和正文未被修改,转发后的邮件仍然可以通过验证。
这恰好弥补了 SPF 的弱点。邮件被转发时,SPF 可能会因为连接 IP 发生变化而失败,但 DKIM 仍然可以通过,从而让 DMARC 接受这封合法邮件。
DKIM 的限制
DKIM 功能强大,但单独使用并不完整:
- 它能证明某个域名为邮件签名,但不会强制签名域名与可见发件人标头匹配,这正是 DMARC 对齐机制的作用
- 攻击者可以使用自己的域名对应的有效 DKIM key 为邮件签名
- 私有 key 泄露后,攻击者可以伪造有效签名,直到该 key 完成轮换并停止使用
DKIM 必须与 DMARC 结合,才能有效防范伪造。
快速检查
请测试您对 DKIM 的理解。
回顾
您已经学会了 DKIM 如何为邮件签名:
- DKIM会附加加密签名,证明邮件的来源和完整性
- 服务器上的私有 key用于签名;公有 key会在 DNS 中通过选择器发布
- 正文哈希可以检测篡改;规范化可以容忍无害的更改
- 选择器支持安全的key 轮换,并且 DKIM 在 SPF 失败的情况下仍能经得住转发
- DKIM 仍然需要DMARC 对齐,才能将签名与可见发件人关联起来
接下来,您将使用 DMARC 策略和报告把 SPF 与 DKIM 结合起来。
常见问题解答
「DKIM 签名」课时是免费的吗?
是的 — 「DKIM 签名」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cyber Security Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cyber Security Academy 课程共包含 4 节课。
「DKIM 签名」这节课中我会学到什么?
使用密码学为消息签名。 你通过在浏览器中直接运行的动手代码来练习 Cyber Security Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cyber Security Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cyber Security Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「DKIM 签名」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cyber Security Academy 课中编写并运行代码吗?
能。每节 Cyber Security Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 电子邮件欺骗的原理
- SPF 记录
- DKIM 签名
- DMARC 策略与报告