DKIM:展示你的隐私

2020-11-03 09:08:41

如果你和大多数人一样,很有可能你已经多年没有发送过没有加密签名的电子邮件了。你说你不用PGP吗?嗯,即使你没有在你的电子邮件上签名,你的提供商几乎可以肯定会为你签名。以阻止垃圾邮件的名义,似是而非的否认已经被抛在一边,但它并不是必须的。

DKIM最初由RFC4871于2007年标准化,现在几乎得到了普遍采用。引用RFC的话说,协议背后的目标是“允许签名域断言对消息的责任,从而保护消息签名者的身份和他们所传达的消息的完整性”。它是用来防止电子邮件中的发件人身份信息被欺骗的几种技术之一[2]。反垃圾邮件系统使用它来帮助确定在做出处理决策时是否考虑域名的声誉。

虽然DKIM被设计成对防止垃圾邮件有用,但它使用的加密签名已经悄悄地使一种名为“不可否认”的属性成为电子邮件的新常态。这一术语在合同法中使用-例如,如果有人声称“那不是我的签名”,他们可以说是在“否认”文件的真实性。对于电子邮件,其影响是如果您拥有包含完整标题的原始格式的电子邮件副本(例如,电子邮件假脱机转储),则可以检查签名。这是一种可靠的验证手段的程度因情况而异-短到可以被破解的密钥过去很常见,在某些情况下直接窃取私钥是可能的。

与此同时,像OTR及其后继者这样的安全消息传递工具已经采取了明确提供“可否认加密”的方法。最先进的技术允许发送者在给出接收者的公钥的情况下,伪造一份显然是在他们两人之间通过密码检查的抄本。对于这些应用程序的用户来说,这通常是不错的,因为他们知道自己说了什么。据我所知,这并不能创造一张合法的“出狱”卡。它真正做的就是确保这些工具的用户不会因为使用该工具而降低他们的否认性。这是一个问题,DKIM确实让它的用户失望了,显然我不是唯一一个有这种感觉的人。

无关紧要,我真的希望Gmail能开始发布过期的DKIM密钥。

三年多前,我开始为我的域名这么做。从那时起,我每天都运行一个密钥轮换脚本,生成一个新密钥并添加适当的记录(称为“选择器”)。

每个选择器保持存活7天,然后通过发布空出记录的公钥部分的更新来“撤销”。

再过三天,重新创建公钥和私钥所需的最小RSA参数集就会在选择器的“NOTES”字段中发布。

这里的格式是非标准的,因为包含所有冗余数据的完整RSA私钥将超过DNS[3]中存储的字符串的255个字符限制。不过,一个小的Python脚本就足以重新构建一切。

当我最初设置这个功能时,我有点担心过滤系统会遇到问题,因为过滤系统试图在投递后显著验证我发送的电子邮件。根据RFC:

当包含相应公钥的选择器预期在验证者有机会验证签名之前被撤销或移除时,签名者不应该使用私钥签名。签名者应该预料到,验证者可能会选择推迟验证,也许直到最终接收者实际阅读了邮件。特别地,当轮换到新的密钥对时,签名应该立即从新的私钥开始,并且旧的公钥应该在从密钥服务器移除之前被保留一段合理的验证间隔。

在写这篇文章的过程中,我检查了我拥有的24个月的查询日志。除了极少数例外(大多数可能是我自己的测试),除了使用选择器的那一天之外,没有任何针对选择器的查找,所以这在实践中似乎不是问题。

我之前提到过,但我想说清楚--像这样发布DKIM私钥主要是将泄漏作为一种威胁模型来解决。在法律纠纷中,如果邮件的真实性有问题,可以传唤邮件服务器日志和/或存储的邮件。即使在我的情况下,我在专用硬件上也有自己的邮件服务器,并在一个未公开的位置使用全磁盘加密,我发送的大多数邮件都会被送到由第三方操作的服务器,而不会在收件人的要求下更改日志。

对于关注隐私的电子邮件提供商之一来说,尝试部署类似于我在本文中描述的密钥管理策略将是一次有趣的实验。

我找不到任何关于这方面的最新公开数据,但谷歌报告称,截至2016年2月,Gmail用户收到的非垃圾邮件中有87.6%拥有有效的DKIM签名。Https://security.googleblog.com/2013/12/internet-wide-efforts-to-fight-email.html。

电子邮件背后的核心协议SMTP是在80年代初设计的,它使用的术语之一是“信封发件人”。这是恰当的,因为它最初并不比物理信封上的回邮地址更难伪造。

DNS标准提供了通过在记录中简单地存储多个字符串来在TXT记录中存储超过255个字符的值,但是在某些软件中使用这样的记录可能会很烦人。