什么是 OpenPGP 密钥 ID 冲突?

信息安全 pgp gnupg
2021-08-24 02:03:12

最近,一个 Evil32 项目组宣布,他们发现来自公钥服务器 ( https://evil32.com/ ) 的所有 OpenPGP 密钥存在冲突。

碰撞一词指的是什么?

2个回答

他们指的是短密钥 ID,在相当长的一段时间内,它们被认为容易受到碰撞攻击。该问题已在RFC 4880、OpenPGP、3.3 中引用密钥 ID

密钥 ID 是标识密钥的八位字节标量。实现不应该假设密钥 ID 是唯一的。

OpenPGP 指纹和密钥 ID

每个 OpenPGP 密钥都附有一个指纹,主要根据其公钥数据包计算得出,该数据包还包含创建时间。该计算在RFC 4880、OpenPGP、12.2 中定义密钥 ID 和指纹

有短密钥和长密钥 ID,它们类似于指纹的低 32 个相应的 64 位。例如,查看我的 OpenPGP 密钥的 ID:

fingerprint: 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279
long id:                                    4E1F 799A A4FF 2279
short id:                                             A4FF 2279

使用指纹和密钥 ID,因为共享和比较通常为 1024 到 8096 位的整个密钥(为诸如创建日期之类的标头添加更多)是非常不切实际的。

碰撞概率

虽然较短的 ID 更容易共享和比较,但它们也增加了冲突的机会。这在数量上随着长度呈指数增长。这是每个长度可能的密钥 ID 的数量:

2^32  =                                        4294967296
2^64  =                              18446744073709551616
2^160 = 1461501637330902918203684832716283019655932542976

碰撞概率是数字的倒数,即生成两个具有相同 ID 的不同密钥的机会。

查找所有公开可用的 OpenPGP 密钥数据的冲突只需要查找 400 万个密钥的冲突。该项目实际上将自己限制在强集(其中包含最大的键集,它们都链接在一起,可能带有瞬态边缘),目前包含大约 55.000 个键

长密钥 ID 和指纹仍然可能发生密钥冲突,但不太可能发生。可能的指纹数量甚至大于可能的UUID的数量,并且这些通常被认为是唯一的。相同数量的IPv6 地址可用,techtarget.com 提供了一些示例来获得对如此大的数字的印象

枚举键

生成具有合理安全性的密钥需要一些时间,因此枚举足够多的密钥来查找这四百万次冲突是不切实际的。但这就是为什么我已经在上面提到了密钥生成时间:使用单个密钥,您可以从单个(比如说,RSA)密钥创建许多不同的 OpenPGP 密钥,而无需昂贵的密钥生成,您只需随着时间的推移进行迭代。这已经由Micah Lee 在他关于“Trolling the Web of Trust”的演讲中提出。

关于存储为 32 位数字的 UNIX 时间戳,并假设 SHA-1 作为一个好的散列函数具有几乎相等的结果值分布,迭代具有不同时间戳的单个RSA 密钥应该足以生成所有可能的短密钥 ID(实际上,您将不得不为多个键重复此操作)。如果您只想生成在某个合理时间跨度内创建的合理密钥(例如,过去几年,绝对不是在 PGP 发布之前,也不会在未来),您将不得不使用更多的密钥,但生成更多的密钥仍然是在相当短的时间内可以实现。

现在要做什么?

  • 不要相信短密钥 ID,永远不要使用它们进行验证。你永远不应该这样做。
  • 如果您想共享您的密钥,请改用长密钥 ID(或者更好的是整个指纹)。为了非常确定地验证密钥,最好甚至比较完整的指纹。
  • 如果您正在开发处理 OpenPGP 密钥的软件,甚至可以参考整个指纹(计算机并不真正关心是比较 32、64 还是 160 位,但请记住碰撞概率!)。
  • 检查您自己的软件是否遵循这些建议。

Openpgp 使用密钥 ID 来识别密钥。“密钥 ID”是公钥散列的一部分。有两种类型,“短”(32 位)和“长”(64 位)。

对于短键 ID,构造一个新的键是相当容易的,它具有与现有键相同的短键 ID 和相同的用户可见详细信息。通过短键 ID 来识别键是一种常见的(不好但常见的)做法。

如果你正在围绕 openpgp 构建一个系统,你需要仔细检查短密钥 ID 永远不会被用作指示哪些密钥是可信的。

甚至 gpg 本身也搞砸了,当从密钥服务器请求密钥时,它会通过短密钥 ID 请求(即使用户指定了长密钥)。如果您使用“密钥环”文件作为针对给定目的受信任的密钥列表,这使得最终信任攻击者生成的密钥变得非常容易。

即使您有更新的 gpg,也几乎可以肯定只对存在不受信任的密钥不成问题的密钥环执行“接收”和“刷新”操作,然后在将它们复制到“受信任的密钥”之前仔细检查它们只有”钥匙圈。

http://www.asheesh.org/note/debian/short-key-ids-are-bad-news.html