邮箱签名上链查:ERC-7969 DKIM 登记处的哈希规则与吊销粒度
企业邮件用 DKIM 给正文盖签名戳,收信方靠域名 DNS 里的公钥验戳。公钥轮换、被盗之后,链上应用想复核“这把钥匙当时还算数吗”,就得有个地方可查。2025 年 6 月 11 日创建的 ERC-7969 提供这样一个登记处,按 ercs 仓库记录状态为 Draft,接口注释给出的 ERC-165 标识值是 0xdee3d600。
两个哈希进,一个布尔出
接口主体一个函数:isKeyHashValid(domainHash, keyHash),对该域名下这把密钥哈希返回真假。事件只有两个:KeyHashRegistered 记录某域名注册了某密钥哈希,KeyHashRevoked 记录某域名的密钥被吊销——注意吊销事件只带 domainHash 一个参数,粒度的秘密就藏在这里。参考实现另有 setKeyHash、setKeyHashes 批量登记与 onlyOwner 的 revokeKeyHash。

域名哈希的整体性
标准规定 domainHash 必须是小写域名或子域名的哈希,例子用 keccak256:对 example.com 就是对整个字符串算哈希,对 mail.example.com 则把含子域的完整字符串一起哈希。三条推论被逐条写明:给 example.com 注册的密钥哈希不自动覆盖其子域;每个子域可有自己的独立注册;哈希时域名必须作为单一字符串处理。一句话,登记处眼里 example.com 和 mail.example.com 是两个互不相干的实体。链上核对 DKIM 状态的程序,哈希哪一段字符串决定它问的是谁的钥匙,写错一层子域就是另一条记录。
吊销是整个域名一刀切
KeyHashRevoked 只携带域名哈希,意味着这套设计的吊销粒度是整个域名的密钥集合,而不是单把钥匙。原因在 DNS 运维现实里:域名所有者换密钥时通常整套更换,DNS TXT 记录本来就随 zone 文件一起发布,登记处若支持逐把吊销反而制造链上与 DNS 状态的错位窗口。代价是:只想废一把泄露钥匙的场景,在这套登记处上只能把整个域名的记录撤掉重来。
哈希函数不是随便挑的
标准允许实现自选密码学安全的哈希函数,举例包括 keccak256,以及零知识应用偏好的 Poseidon;安全考虑部分随后提醒:domainHash 与 keyHash 的算法要慎重选择,哈希函数的升级必须提前规划——登记在旧哈希下的记录不会自动跟着迁移,换算法等于换一遍全部键。对读链的人来说,同一个域名在不同登记合约里可能对应完全不同的哈希值,跨合约比对前要先问一句用的什么函数。
从参考实现看权限模型与批量登记
接口之外,原文的参考实现交代了运营侧的现实。登记动作有三个:setKeyHash 为单个域名登记一个密钥哈希,setKeyHashes 批量登记,revokeKeyHash 撤销——后者带 onlyOwner 修饰符,意味着登记合约自身有一个管理员角色,链上登记处并不是无许可的公共邮箱,而是“域名方的公告栏 + 合约方的访问控制”的组合。域名方能不能直接管理自己的条目、还是必须走登记合约运营方的白名单,各实现自定,读代码时先找 owner 的边界。批量函数的存在对应运维现实:DKIM 密钥轮换经常一次换多条 TXT 记录,逐条上链既费 Gas 又制造中间状态窗口。
哈希选型那段再展开一点。标准允许 keccak256,也允许零知识电路友好的 Poseidon,理由是不管哪种哈希,链上比较的都只是哈希值;但安全考虑部分跟着敲了黑板:domainHash 与 keyHash 的算法要慎选,升级必须预先规划——已经登记在旧哈希下的条目不会因为换算法而自动改名,两套哈希混存的登记处等于没有登记处。对使用方,可操作的检查清单是:确认合约用的是哪种哈希函数、确认查的是完整域名字符串而不是主域、确认 KeyHashRevoked 之后有没有新的 KeyHashRegistered——吊销和重登记之间的空窗里,验证失败的邮件签名属于预期行为而非攻击。
这份提案把邮件世界最外层的信任锚(DNS 里那串公钥)拉进链上可查视野,能说明的是“登记处认为该域名此刻是否认可该密钥哈希”,不能说明邮件内容安全或域名主人的其他意图。本文为机制说明,不构成任何投资建议。
发表评论
还没有评论,来说两句吧。
评论区为展示样式,提交不会被处理。