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

5
我已向我们的客户发送了10000封邮件,每封邮件都有一个格式为的链接。
http://example.com/LogIn?key={guid}

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

根据服务器返回的404状态码,我已经确定了我发出的一些guid。我读到过Windows中的guid生成器很薄弱,因此你可以从已有的一个guid预测下一个。有人知道怎么做吗?如果我能做到这一点,就可以使我发送的guid有效,使链接再次正常工作。


为什么不检查已发送的电子邮件并解析从中发送的GUID?你有一些邮件服务器档案吗?或者,您可以启用该表单的任何GUID。就像没有等待利用您的提供的链接细节并且您没有GUID一样(直到您在S.O上发布为止),也没有一群坏家伙。 - Hejazzman
有没有办法获得您发送的副本并处理呢?如果您拥有自己的邮件服务器,它可能已经保留了一份副本。 - Anders Öhrt
请参见:https://dev59.com/eHRB5IYBdhLWcg3wXmRI - Sam Saffron
很遗憾,邮件没有被记录下来。每个GUID都与一组数据相关联,只有特定客户才能查看和编辑。这是一个密码。 - tobi
8
我认为最好的做法是重新进行这个过程,并发送带有有效链接的电子邮件,同时向您的客户道歉。 - Brian Campbell
5个回答

8
Windows生成GUID的方式已经改变了很多次,许多看似可靠的互联网建议是完全错误的(也许只是过时了,也许一直是完全错误的)。
上一次我研究这个问题是几年前,可能是XP SP2。我直接进入操作系统代码,看看实际发生了什么,它使用安全随机数生成器生成了一个随机数。
如果您以默认方式生成GUID,则很难预测一个GUID与另一个GUID之间的关系。

1
你有相关的来源吗?也就是说,为什么我要相信你的话,因为这篇帖子也是“在互联网上”。您能确定.NET 4.5和MS SQL Server使用此OS功能吗? - SilverlightFox
@SilverlightFox 好吧,这告诉你我是如何得出结论的,即通过使用调试器进入Windows - 没有任何阻止你这样做。.NET的源代码也可用(或者可以轻松反编译),因此您也可以检查它。我的观点主要是关于大多数关于此事的“绝对确认”的陈述需要明确说明适用于哪些版本的什么。 - Will Dean
我已经把这个问题作为一个新的问题提出来了,如果你有兴趣发布一个关于这个主题的权威答案,我想邀请你回答。如果没有也没关系,谢谢。 - SilverlightFox
Windows 2000及以后版本使用加密随机算法生成v4 GUID。但是,您绝不能将GUID用于加密,而应直接使用RNGCryptoServiceProvider(.NET)或类似工具,因为这才是它的本意。即使您了解.NET GUID使用CSPRNG,其他GUID算法也不一定如此。如果您使用GUID,则表示它们在任何地方都是安全的,但实际上它们绝对不是。 - undefined

3

首先,您需要了解它们是否符合RFC4122标准,并获取版本信息。

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

UUIDv1由以下部分组成:

  • 时间戳(自公元格里高利历以来的100纳秒间隔)
  • 版本(1)半字节
  • 两个(或三个)RFC4122兼容位(这导致半字节在[89ab]中)
  • 时钟ID(随机位)
  • 节点ID(常量6字节掩码)

您只需遍历可能的时间戳即可。请注意,有很多100纳秒间隔!

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

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

正如Nikolay «denish» Denishchenko(Kaspersky)不久前演示的那样,鉴于对生成UUID的进程的调试访问权限,人们可以窃取当前的RC4上下文,并在其他地方复制最多500,000个UUID。这已经在Microsoft Windows XP上演示过(嗨,Will Dean),它使用有趣的8 * RC4机制,仅在实际熵种子每500,000个UUID时才播种。

在Windows 10上(它不是完全基于Windows版本,而是.NET框架或rpcrt4.dll版本),它不再是RC4,而是AES,可能以CTR模式使用。可能存在相同的熵复用。

有关更多信息,请访问我在这里的工作https://uuid.pirate-server.com/blog/


1

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


1
类型4是随机的,但规范中没有说明这种随机性是否具有加密安全性——这取决于实现。 - SilverlightFox

0

即使您能够预测下一个GUID,这也是不可靠的,但很可能在您可支配的资源范围内完全不可能。

在这里,您最好的选择是将任何不匹配的GUID添加手动重定向到通用页面,该页面可以解释出了什么问题或者只是通过编程找出他们应该到达的位置并将其发送到那里。


-1

GUID 的一部分是当前日期/时间。如果您连续收到两个 GUID,则可以确定它们被创建的速度,并因此有很强的信心预测序列。


3
只有当它们是类型1的GUID时才成立。 - user192472

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接