阅读了这篇最近的文章:Wired-DKIM 漏洞,我有几个问题。
如何通过查看标题来确定正在使用的密钥长度?
我假设攻击如下:如果我错了,请纠正我:
通过了解公钥、机制(即 RSA 等)来分解私钥(短密钥长度)
欺骗电子邮件,将 DKIM 哈希替换为非法计算的哈希
欺骗验证者认为电子邮件的来源是正确的
阅读了这篇最近的文章:Wired-DKIM 漏洞,我有几个问题。
如何通过查看标题来确定正在使用的密钥长度?
我假设攻击如下:如果我错了,请纠正我:
通过了解公钥、机制(即 RSA 等)来分解私钥(短密钥长度)
欺骗电子邮件,将 DKIM 哈希替换为非法计算的哈希
欺骗验证者认为电子邮件的来源是正确的
我已经为 Microsoft Exchange 编写了一个 DKIM 解析器和签名器,所以这非常简单。请注意,存储在 DNS 中的公钥不是典型的公钥,它采用更紧凑的形式,称为“公钥主题形式”。
如何通过查看标题来确定正在使用的密钥长度?
{s value}
._domainkey。{d value}
(省略括号)在 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 上。