最近,一个 Evil32 项目组宣布,他们发现来自公钥服务器 ( https://evil32.com/ ) 的所有 OpenPGP 密钥存在冲突。
碰撞一词指的是什么?
最近,一个 Evil32 项目组宣布,他们发现来自公钥服务器 ( https://evil32.com/ ) 的所有 OpenPGP 密钥存在冲突。
碰撞一词指的是什么?
他们指的是短密钥 ID,在相当长的一段时间内,它们被认为容易受到碰撞攻击。该问题已在RFC 4880、OpenPGP、3.3 中引用。密钥 ID:
密钥 ID 是标识密钥的八位字节标量。实现不应该假设密钥 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 发布之前,也不会在未来),您将不得不使用更多的密钥,但生成更多的密钥仍然是在相当短的时间内可以实现。
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