如何预测给定GUID的下一个GUID?

时间:2009-05-03 12:01:20

标签: cryptography email guid cryptanalysis

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

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

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

根据我从网络服务器收到的404s,我发了一些guid。我已经读过windows中的guid生成器很弱,​​所以你可以预测你已经拥有的下一个guid。有谁知道怎么样?如果我能做到这一点,我可以使我发出的guid有效,这样链接就可以了。

5 个答案:

答案 0 :(得分:7)

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

我最后一次研究这个问题(几年前,可能是XP SP2),我直接进入操作系统代码,看看实际发生了什么,并使用secure random number generator生成一个随机数字

如果您以默认方式生成一个GUID,我怀疑您会预测另一个GUID。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

UUIDv1由以下组成:

  • 时间戳记(自公历时期起间隔100 ns)
  • 版本(1)轻咬
  • 符合RFC4122标准的两个(或三个,大声笑)位(这会导致[89ab]中出现半字节)
  • 时钟ID(随机位)
  • 节点ID(恒定6个字节的掩码)

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

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

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

正如尼古拉·德涅申科(卡巴斯基)不久前所证明的那样,只要对生成UUID的进程进行调试访问,就可以窃取当前的RC4上下文并在其他地方重现500000 UUID。这已经在Microsoft Windows XP上得到了证明(嗨,Will Dean),该Windows XP使用了一种有趣的8 * RC4机制,并且每隔500000个UUID便仅植入了实际的熵。

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

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

答案 3 :(得分:0)

即使你可以做到这一点,预测下一个GUID也是不可靠的,但是你可以利用这些资源完全不可能。

这里最好的办法就是简单地从任何不匹配的GUID添加一个手动重定向到一个通用页面,该页面可以解释出错的地方,或者只是以编程方式确定它们应该在哪里结束并将它们发送到那里。

答案 4 :(得分:-1)

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