在最近的 DKIM 漏洞中,有人如何通过查看标头来确定密钥长度?

信息安全 密码学 攻击
2021-08-23 03:47:02

阅读了这篇最近的文章:Wired-DKIM 漏洞,我有几个问题。

如何通过查看标题来确定正在使用的密钥长度?

我假设攻击如下:如果我错了,请纠正我:

  1. 通过了解公钥、机制(即 RSA 等)来分解私钥(短密钥长度)

  2. 欺骗电子邮件,将 DKIM 哈希替换为非法计算的哈希

  3. 欺骗验证者认为电子邮件的来源是正确的

2个回答

我已经为 Microsoft Exchange 编写了一个 DKIM 解析器和签名器,所以这非常简单。请注意,存储在 DNS 中的公钥不是典型的公钥,它采用更紧凑的形式,称为“公钥主题形式”。

如何通过查看标题来确定正在使用的密钥长度?

  1. 对标头中的以下值执行 TXT 查询: {s value}._domainkey。{d value} (省略括号)
  2. 提取上述 DNS 查询中名为“p=”的值
  3. 使用 ASN.1 解析器来确定密钥长度和其他存储在

在 DKIM "p=" 查询中找到的示例公共 2048 位密钥,指数为 65537

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoSd6ya7haEmQl1sWoEVVou8iC618evFqluT5zb
0aMEgBEfHSJRjT/FojPWqhjAtCYMAIggaE0ZxVzPDsMeRc3Mixy2WO9DWYAJuzwP7DyzUAclhGTfP4cG44SlbSsEsMM/91cu5zr9+TulnqPDxUyPvLZjGpJEHXoEWc4m
f6tbksyxZTI+wssw84NLfEs3VC4jN9P1CnfG2aTCC74lj1mePbEBCsg83+Ilz/dsDcH2FGmWVa5ytNCP7kkzyBYkfF09YpDiSXxowRGZbRkGveDvOP3ONUhLrXumpTP6
+/Hm34kbG/kGBSxNOXn8/2jf2m+08Bt8ci9Orzb2s8J81q6QIDAQAB

只需将此密钥粘贴到ASN.1 Javascript 解码器中即可计算出密钥长度。大多数程序员只有一个库来解决这个问题。

RSA 签名大小取决于密钥大小。一个 512 位的密钥产生一个 64 字节长的签名。标头以 Base64 编码签名结尾,因此通过填充我的记忆告诉我这将是 88 个字节长。因此,只需查看签名即可确定密钥长度。

分解密钥,使用密钥签名(因为您现在拥有它),然后发送所有预期的标头。

有关此的更长版本/解释,请参阅RSA 签名大小?在 StackOverflow 上。