域名密钥识别邮件 (DomainKeys Identified Mail (DKIM) ) 是一种电子邮件身份验证方法,有助于防止垃圾邮件发送者和其他恶意方冒充合法域。
所有电子邮件地址都有一个域 — 地址中“@”符号之后的部分。垃圾邮件发送者和攻击者在发送电子邮件时可能会尝试冒充域以进行网络钓鱼攻击或其他诈骗。
假设查克想欺骗为 example.com 工作的爱丽丝,让他向他发送公司机密信息。他可以给她发一封似乎来自“bob@example.com”的电子邮件,以欺骗她认为他也为 example.com 工作。
DKIM以及发件人策略框架(SPF)和基于域的邮件身份验证报告和一致性(DMARC)使攻击者更难以这种方式模拟域。未通过 DKIM 和 SPF 的电子邮件会被标记为“垃圾邮件”或电子邮件服务器不会递送。如果 example.com 为他们的域设置了DKIM,SPF和DMARC,那么Alice可能永远不会看到Chuck的恶意电子邮件,因为它要么进入她的垃圾邮件文件夹,要么被电子邮件服务器完全拒绝。
DKIM如何工作?
DKIM 有两个主要方面:DKIM 记录(存储在域的域名系统 (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 记录的示例:
Name 名字 | Type 类型 | Content 内容 | TTL |
---|---|---|---|
big-email._domainkey.example.com | TXT | v=DKIM1; p=76E629F05F70 | 6000 |
Name 名字
与大多数 DNS TXT 记录不同,DKIM 记录存储在专用名称下,而不仅仅是域名称。DKIM 记录名称遵循以下格式:
[selector]._domainkey.[domain]
这是 selector
域使用的电子邮件服务提供商发出的专用值。它包含在 DKIM 标头中,以使电子邮件服务器能够在 DNS 中执行所需的 DKIM 查找。是 domain
电子邮件域名。 ._domainkey.
包含在所有 DKIM 记录名称中。
要查找 DKIM 记录,电子邮件服务器使用电子邮件服务提供商提供的 DKIM 选择器,而不仅仅是域名。假设 example.com 使用大电子邮件作为其电子邮件服务提供商,并假设大电子邮件使用 DKIM 选择器 big-email
。大多数示例.com的 DNS 记录将被命名 example.com
,但它们的 DKIM DNS 记录将在名称 big-email._domainkey.example.com
下,如上例中列出。
Content 内容
列出公钥的 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 发送电子邮件,并且主题行是“芝士蛋糕食谱”,则此处使用的内容将是“bob@example.com”+“alice@example.com”+“芝士蛋糕食谱”。(这些内容也将规范化 – 放入标准化格式。bh=
是电子邮件正文的哈希值。哈希是称为哈希函数的专用数学函数的结果。包括此功能,以便接收电子邮件服务器可以在加载整个电子邮件正文之前计算签名,因为电子邮件正文可以是任意长度,并且在某些情况下加载可能需要很长时间。a=
是用于计算数字签名的算法,或b
,以及生成电子邮件正文的哈希,或bh
。在此示例中,正在使用 RSA-SHA-256(RSA 使用 SHA-256 作为数字签名的哈希函数,使用 SHA-256 作为正文哈希)。b=
is the digital signature, generated fromh
andbh
and signed with the private key.b=
是数字签名,由私钥生成h
并使用bh
私钥签名。
The digital signature (b=
) allows the receiving server to 1. authenticate the sending server and 2. ensure integrity — that the email has not been tampered with.
数字签名 ( 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 记录,帮助域管理员阻止恶意方冒充其域。