什么是 DNS DKIM 记录?

DKIM 记录是专门的 DNS TXT 记录,存储用于验证电子邮件真实性的公钥。

学习目标

阅读本文后,您将能够:

  • 描述 DKIM 如何帮助阻止垃圾邮件
  • 查看 DKIM 记录的示例
  • 解释 DKIM 标头的工作原理

相关内容


想要继续学习吗?

订阅 TheNET,这是 Cloudflare 每月对互联网上最流行见解的总结!

参阅 Cloudflare 的隐私政策,了解我们如何收集和处理您的个人数据。

复制文章链接

所有 Cloudflare 计划中均包含免费 DNS

什么是 DKIM?

域名密钥识别邮件 (DKIM) 是一种电子邮件验证方法,有助于防止垃圾邮件发送者和其他恶意方冒充合法域名

所有电子邮件地址都有一个 域名 ,即地址中“@”符号之后的部分。垃圾邮件发送者和攻击者在发送电子邮件时可能试图冒充域名,以进行网络钓鱼攻击或其他骗局。

假设 Chuck 想欺骗为 example.com 工作的 Alice,让她给他发送公司的机密信息。他可以给她发送一封看似来自“[email protected]”的电子邮件,以骗取她的信任,让她以为他也在为 example.com 工作。

DKIM 与发送方策略框架 (SPF)基于域的消息身份验证、报告和一致性 (DMARC) 一起,使得攻击者以这种方式冒充域名的难度大大增加。没有通过 DKIM 和 SPF 的电子邮件会被标记为“垃圾邮件”,或者不被电子邮件服务器投递。如果 example.com 为其域名设置了 DKIM、SPF 和 DMARC,那么 Alice 甚至可能永远不会看到 Chuck 的恶意电子邮件,因为它要么进入了她的垃圾邮件文件夹,要么被电子邮件服务器完全拒绝。

DKIM 是如何工作的?

DKIM 有两个主要方面:DKIM 记录,它存储在域的 Domain Name System (DNS) 记录中,以及 DKIM 标头,它附加在所有来自该域的电子邮件中。

DKIM 使用基于公钥加密的数字签名方案,以验证电子邮件的来源,即它确实来自于从该域发送电子邮件的服务器。使用一对加密密钥:发件人用于签署邮件的私钥,以及接收者用于验证签名的公钥。接收者不能使用公钥来签署邮件,反之亦然。

电子邮件提供商生成公钥和私钥。他们将公钥交给域名所有者,后者将公钥存储在一个公开的 DNS 记录中,即 DKIM 记录。

所有从该域名发送的电子邮件都包含一个 DKIM 标头,其中包含一段使用私钥签署的数据:这被称为“数字签名”。电子邮件服务器可以查看 DKIM DNS 记录,获得公钥,并使用公钥来验证数字签名。

这个过程也确保了电子邮件在传输过程中没有被更改。如果电子邮件的标题或邮件正文被更改,数字签名将无法验证——就像药罐上的防伪封条。

什么是 DKIM 记录?

DKIM 记录存储了 DKIM 公钥,这是一串随机字符,用于验证使用私钥签署的任何内容。电子邮件服务器查询域名的 DNS 记录,以查看 DKIM 记录和其中的公钥。

DKIM 记录实际上是一种 DNS TXT(“文本” )记录。TXT 记录可用于存储域名管理员想要与其域名相关联的任何文本。DKIM 就是该类型 DNS 记录的许多用途之一。(在某些情况下,域名将其 DKIM 记录存储为反而指向密钥的 CNAME 记录;但是,官方 RFC 要求这些记录是 TXT。)

下面是一个 DKIM DNS TXT 记录的示例:

名称 在提示下键入 内容 TTL
big-email._domainkey.example.com TXT v=DKIM1; p=76E629F05F70
9EF665853333
EEC3F5ADE69A
2362BECE4065
8267AB2FC3CB
6CBE
6000

名称

与大多数 DNS TXT 记录不同,DKIM 记录被存储在一个专门的名称下,而不仅仅是域名的名称。DKIM 记录名称遵循以下格式:

[selector]._domainkey.[domain]

selector 是由域名使用的电子邮件服务提供商发布的专门值。它包含在 DKIM 标头中,使电子邮件服务器能够在 DNS 中执行所需的 DKIM 查找。domain 是电子邮件域名。._domainkey. 包含在所有 DKIM 记录名称中。

为了查询 DKIM 记录,电子邮件服务器使用电子邮件服务提供商提供的 DKIM 选择器,而不仅仅是域名。假设 example.com 使用 Big Email 作为他们的电子邮件服务提供商,并且假设 Big Email 使用 DKIM 选择器 big-email。example.com 的大部分 DNS 记录将被命名为 example.com,但他们的 DKIM DNS 记录名称将为 big-email._domainkey.example.com,这已在上面的示例中列出。

内容

这是列出公钥的 DKIM DNS 记录的部分。在上面的示例中,v=DKIM1 表示这个 TXT 记录应当被解释为 DKIM,公钥则是 p= 之后的内容。

记录类型和 TTL

这些是 DNS 记录中的标准字段。TXT 表示这是一个 DNS TXT 记录。“TTL”代表生存时间(以秒为单位),它表示该记录在需要刷新之前被视为有效的时长。DKIM 记录的 TTL 一般为几分钟。

什么是 DKIM 标头?DKIM 签名是如何工作的?

发送电子邮件的服务器使用电子邮件标题、电子邮件正文(实际上是电子邮件正文的哈希值——请阅读下文了解更多信息)和私钥来创建其数字签名。该数字签名作为 DKIM 标头的一部分附加在电子邮件中。

DKIM 标头是附加在电子邮件中的多个标头之一。大多数电子邮件应用程序在显示电子邮件时不会显示标头,除非用户选择某些选项。以 Gmail 为例,用户可以通过点击电子邮件右上方的三个垂直点,然后点击“显示原文”来查看电子邮件的标头。

下面是一个 DKIM 标头的示例:

v=1; a=rsa-sha256; 
        d=example.com; s=big-email;
        h=from:to:subject;
      bh=uMixy0BsCqhbru4fqPZQdeZY5Pq865sNAnOAxNgUS0s=;
  b=LiIvJeRyqMo0gngiCygwpiKphJjYezb5kXBKCNj8DqRVcCk7obK6OUg4o+EufEbB
tRYQfQhgIkx5m70IqA6dP+DBZUcsJyS9C+vm2xRK7qyHi2hUFpYS5pkeiNVoQk/Wk4w
ZG4tu/g+OA49mS7VX+64FXr79MPwOMRRmJ3lNwJU=
  • v= 显示正在使用哪个版本的 DKIM。
  • d= 是发件人的域名。
  • s= 是选择器,接收服务器应使用它来查找 DNS 记录。
  • h= 列出了用于创建数字签名 (b) 的标头字段。在本示例中,使用的是发件人、收件人和主题标头。如果 Bob 使用 example.com 域名向 Alice 发送电子邮件,主题行是“Recipe for cheesecake”,这里使用的内容将是“[email protected]” +“[email protected]” +“Recipe for cheesecake” 。(该内容也将规范化,即形成标准化的格式。)
  • bh= 是电子邮件正文的哈希值。哈希值是一个专门的数学函数的结果,称为哈希函数。包含该值是为了使接收电子邮件的服务器能够在整个电子邮件正文加载之前计算签名,因为电子邮件正文可能是任何长度,在某些情况下加载可能需要很长的时间。
  • a= 是用于计算数字签名 (b) 以及生成电子邮件正文哈希值 (bh) 的算法。在这个示例中,使用的是 RSA-SHA-256(RSA 使用 SHA-256 作为数字签名的哈希函数,并使用 SHA-256 用于正文哈希)。
  • b=数字签名,由 hbh 产生,并使用私钥签名。

数字签名 (b=) 允许接收服务器:1. 对发送服务器进行验证;2.确保完整性,即电子邮件没有被篡改。

接收服务器通过使用 h= 中列出的相同内容加上正文哈希值 (bh=) 以及 DKIM 记录中的公钥来检查数字签名是否有效。如果使用了正确的私钥,并且内容(标题和正文)没有被改变,那么该电子邮件就通过了 DKIM 检查。

DKIM 与 DMARC 有什么关系?

DMARC 是一种建立在 DKIM 和 SPF 之上的电子邮件验证方法。DMARC 描述了如何处理未通过 SPF 和 DKIM 的电子邮件。SPF、DKIM 和 DMARC 结合起来,帮助防止垃圾邮件和电子邮件欺骗。与 DKIM 记录一样,DMARC 政策以 DNS TXT 记录的形式存储。

Cloudflare 提供了一个电子邮件安全 DNS 向导,允许用户快速设置电子邮件验证 DNS TXT 记录,帮助域名管理员阻止恶意方冒充其域名。

进一步了解电子邮件的 DNS 记录:

要了解有关 DKIM 的更多信息,请参见 RFC 6376