4

我已经向我们的客户发送了 10000 封邮件,每封邮件都有一个格式的链接

http://example.com/LogIn?key={guid}

不幸的是,guid我发送的是随机指南(由 生成的测试数据Guid.NewGuid()),所以客户都收到了无效链接......

根据我从网络服务器收到的 404,我发送了一些指南。我读过 Windows 中的 guid 生成器很弱,​​因此您可以从已有的 guid 预测下一个 guid。有谁知道怎么做?如果我能做到这一点,我可以使我发送的指南有效,这样链接就会再次起作用。

4

5 回答 5

8

Windows 生成 GUID 的方式已经改变了好几次,互联网上许多看似可靠的建议是完全错误的(也许只是过时了,也许总是完全错误)。

上次我研究这个(几年前,可能是 XP SP2)时,我直接进入操作系统代码以查看实际发生的情况,它正在使用安全随机数生成器生成一个随机数。

如果您以默认方式生成它们,我怀疑您会很幸运地从另一个预测一个 GUID。

于 2009-05-03T14:06:16.880 回答
2

首先,您需要知道它们是否符合 RFC4122,并且您需要获取版本。

如果是 UUIDv1,你可以预测它们

UUIDv1 由:

  • 时间戳(自公历纪元以来的 100 ns 间隔)
  • A版(1)半字节
  • RFC4122 合规性的两个(或三个,lol)位(这会导致半字节在 [89ab] 中)
  • 时钟 id(随机位)
  • 节点 ID(常量 6 字节掩码)

您只需要遍历可能的时间戳。当心,那里有很多 100 ns 的间隔!

一些软件正在生成 UUIDv1(Grafana 仪表板 ID、Airbnb 列表等),但一些软件依赖于随机 UUID、UUIDv4。

如果是 UUIDv4,你可能会窃取 PRNG 上下文

正如 Nikolay «denish» Denishchenko (Kaspersky) 不久前所展示的,如果对生成 UUID 的进程具有调试访问权限,则可以窃取当前的 RC4 上下文并在其他地方复制多达 500000 个 UUID。这已经在 Microsoft Windows XP 上得到了证明(嗨,Will Dean),它使用了一个有趣的 8*RC4 机制,并且每 500000 个 UUID 只用实际熵播种。

在 Windows 10 上(它不完全是 Windows 版本,而是 .NET 框架或 rpcrt4.dll 版本),它不再是 RC4 而是 AES,大概用于 CTR 模式。大概有相同的熵重用。

有关更多信息,请查看我在那里所做的工作https://uuid.pirate-server.com/blog/

于 2018-12-03T04:47:10.293 回答
1

有几种不同类型的指南。类型 1 使用主机 ID(通常是 MAC 地址)、序列号以及当前日期和时间。类型 4 是完全随机的。如果它是 1 类 UUID,您可能会找出一组相当有限的可能 UUID,但即便如此,您也无法生成单个 UUID 序列,因此您将无法确定特定用户的特定 UUID。

于 2009-05-03T13:59:54.507 回答
0

即使您能做到,预测下一个 GUID 也是不可靠的,但如果您拥有可支配的资源,这很可能是完全不可能的。

您最好的选择是简单地将手动重定向从任何不匹配的 GUID 添加到通用页面,该页面要么解释出了什么问题,要么只是以编程方式确定它们应该在哪里结束并将它们发送到那里。

于 2009-05-06T18:17:43.130 回答
-1

GUID 的一部分是当前日期/时间。如果您碰巧按顺序收到其中两个,那么您可以知道它们的创建速度有多快,因此可以很有信心地预测序列。

于 2009-05-03T12:31:51.473 回答