Caloogy 文章
English

邮件防伪:SPF、DKIM、DMARC

日期
2026 年 3 月 9 日
系列
Web 安全
阅读
3 分钟
主题
EmailSpfDkimDmarc

一句话版本

电子邮件诞生时根本没有身份验证:任何人都能发一封"发件人:noreply@你的银行.com"的邮件。三个后来补上的 DNS 机制各管一件事:SPF 规定"哪些服务器可以替我发信",DKIM 给每封信盖一个数字签名,DMARC 规定"冒充我的信该怎么处理"并要求发件人域名对齐。 三者都配好、DMARC 策略收紧之后,冒充你域名的钓鱼邮件会被直接送进垃圾箱或拒收。再配合"防钓鱼码"和"邮件里不放可点击的操作链接",就能大大降低用户被假邮件骗的概率。

全文分三层:

  1. 通俗理解:为什么邮件那么容易冒充
  2. 实际用处:BEC 诈骗、2024 年 Gmail 和雅虎的新规、防钓鱼码
  3. 原理与工程要点:三条 DNS 记录逐条解读、"对齐"、从 p=none 到 reject

第一层:通俗理解

1.1 信封上的寄件人可以随便写

寄纸质信时,你可以在信封上写任何寄件人地址,邮局不会检查。早期的电子邮件协议(SMTP)也是这样:发件人地址只是一行可以随便填写的文字。

1.2 三道补丁

机制 比喻 回答的问题
SPF 公司公布"我们只用这几家快递寄信" 这封信是从授权的服务器发出来的吗?
DKIM 每封信上盖公司的钢印(数字签名) 这封信真的是这个域名签发的?路上被改过吗?
DMARC 公司告诉所有邮局:"不符合上面规则的冒牌信,请扔掉" 验证失败怎么办?发件人地址和验证结果对得上吗?

第二层:实际用处

Caloogy Wallet 也采用了 DMARC 和防钓鱼码。


第三层:原理与工程要点

3.1 SPF

在 DNS 里加一条 TXT 记录:

example.com.  TXT  "v=spf1 include:_spf.某发信服务.com -all"

收件服务器检查:这封信的信封发件人(Return-Path)所在域名,是否允许发信服务器的 IP 发信。-all 表示其他服务器一律不允许。

局限:SPF 只检查信封发件人,而用户在邮件客户端里看到的是信头的 From:,两者可以不同。所以单靠 SPF 挡不住冒充,需要 DMARC 的"对齐"。SPF 记录展开后最多只能有 10 次 DNS 查询,接入的发信服务太多会超限。

3.2 DKIM

发信服务器用私钥对邮件的关键信头和正文签名,签名放在 DKIM-Signature 头里:

DKIM-Signature: v=1; a=rsa-sha256; d=example.com; s=sel1; h=from:to:subject:date; bh=...; b=...

收件服务器按 s=(选择器)和 d=(域名)去 DNS 查 sel1._domainkey.example.com 拿公钥验签。签名算法通常是 RSA(见《RSA与欧拉定理》),也支持 Ed25519。

DKIM 的好处是能经过转发:只要签过名的部分没被改,转发后仍能验证。

3.3 DMARC 与"对齐"

_dmarc.example.com.  TXT  "v=DMARC1; p=quarantine; adkim=r; aspf=r; rua=mailto:[email protected]"

DMARC 的核心规则:SPF 或 DKIM 至少一项通过,并且通过的那一项所用的域名必须和用户看到的 From: 域名对齐(r 宽松对齐允许子域名,s 严格对齐要求完全相同)。

策略 p= 收件方怎么处理冒牌信
none 照常投递,只给你发报告(用于观察)
quarantine 放进垃圾箱
reject 直接拒收

rua= 指定接收汇总报告的地址。各大邮箱每天会告诉你:"有哪些服务器以你的名义发了多少信,多少通过、多少失败。"

3.4 安全收紧的步骤

  1. 先列清楚所有以你域名发信的渠道(营销邮件、交易通知、客服系统、个人邮箱);
  2. 给每个渠道配好 SPF 和 DKIM;
  3. DMARC 先用 p=none 收一段时间报告,确认合法邮件都能通过;
  4. 改为 p=quarantine,再观察;
  5. 最终改为 p=reject。

跳过第 1 步直接收紧,最常见的后果是自己的正常邮件(比如某个被遗忘的系统通知)全进了垃圾箱。

3.5 DMARC 管不到的地方

这些只能靠用户教育、防钓鱼码,以及"邮件里不放操作链接"来弥补。


总结

机制 一句话
SPF 谁可以替我发信
DKIM 每封信有我的签名
DMARC 冒牌信怎么处理,且发件人要对齐
收紧路线 盘点渠道 → none 观察 → quarantine → reject
补充 防钓鱼码、邮件不放操作链接,对付相似域名