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

Cryptography 如何根据给定的GUID预测下一个GUID?,cryptography,email,guid,cryptanalysis,Cryptography,Email,Guid,Cryptanalysis,我已经向我们的客户发送了10000封邮件,每封邮件都有这种格式的链接 http://example.com/LogIn?key={guid} 不幸的是,我发送的guid是随机的guid(由guid.NewGuid()生成的测试数据),因此客户都收到了无效链接 基于我从Web服务器收到的404,我发送了一些GUI。我读到windows中的guid生成器很弱,因此您可以根据现有guid预测下一个guid。有人知道怎么做吗?如果我能做到这一点,我可以使我发送的GUID有效,这样链接就可以再次工作。G

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

http://example.com/LogIn?key={guid}
不幸的是,我发送的
guid
是随机的guid(由
guid.NewGuid()
生成的测试数据),因此客户都收到了无效链接


基于我从Web服务器收到的404,我发送了一些GUI。我读到windows中的guid生成器很弱,因此您可以根据现有guid预测下一个guid。有人知道怎么做吗?如果我能做到这一点,我可以使我发送的GUID有效,这样链接就可以再次工作。

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

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

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

上次我研究这个问题时(几年前,可能是XP SP2),我直接进入操作系统代码,看看实际发生了什么,它生成了一个随机数


如果您以默认方式生成GUID,我怀疑您是否能够从一个GUID预测另一个GUID

预测下一个GUID是不可靠的,即使您可以这样做,但很可能是完全不可能的,因为您可以使用这些资源


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

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

如果是UUIDv1,你可以预测它们 UUIDv1由以下部件组成:

  • 时间戳(自公历纪元以来的100 ns间隔)
  • 一个版本(1)小口
  • RFC4122符合性的两个(或三个,lol)位(这导致半字节位于[89ab]中)
  • 时钟id(随机位)
  • 节点id(常量6字节掩码)
您只需迭代可能的时间戳。当心,有很多100纳秒的间隔

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

如果是UUIDv4,您可能会窃取PRNG上下文 正如Nikolay«denish»Denishchenko(Kaspersky)不久前所展示的那样,如果有对生成UUID的进程的调试访问权,可以窃取当前的RC4上下文并在其他地方复制多达500000个UUID。这已经在微软Windows XP上演示过了(嗨,威尔·迪恩),它使用了一种有趣的8*RC4机制,并且每500000个UUID只植入了实际的熵

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


有关更多信息,请检查我在那里做的工作

为什么不检查发送的邮件并解析从那里发送的guid?你有邮件服务器档案吗?或者您可以只启用该表单的任何GUID。这并不是说有一大群坏蛋等着利用你的报价,他们知道发送链接的详细信息,而且你没有GUID(直到你在s.O上的帖子)。难道没有办法获得你发送的内容的副本并进行处理吗?如果您有自己的邮件服务器,它可能会保留一份副本。请参阅:很遗憾,邮件没有被记录。每个guid都与一组只有特定客户才能查看和编辑的数据相关联。这是一个密码。我认为最好是简单地重做这个过程,发送带有工作链接的电子邮件,并向您的客户道歉。只有当他们是类型1 GUID时。您有任何来源吗?也就是说,我为什么要相信你的话,因为这篇文章也是“在互联网上”。你能肯定地确认.NET 4.5和MS SQL server使用了这个操作系统功能吗?@SilverlightFox Well,它告诉你我是如何得出结论的,那就是使用调试器进入Windows,没有什么能阻止你这么做。NET的源代码也是可用的(或者可以进行简单的反编译),所以您也可以查看它。我的观点主要是,关于这一点,大多数“明确确认”的声明需要精确限定它们适用于什么版本。我问了这个问题,如果你有兴趣发布关于这个问题的规范答案,我想请你回答这个问题?如果不是,也没问题。谢谢。Windows 2000及更高版本对v4 GUI使用加密随机算法。(来源:)既然说你不应该使用加密的guid,那就直接使用
RNGCryptoServiceProvider
(.NET)或类似的东西,这正是它的初衷。即使您了解.NET guid使用CSPRNG,其他guid算法也不使用。通过使用guid,您可以表示它们在任何地方都是安全的,而且它们绝对不是。类型4是随机的,但规范中没有说明这种随机性是加密安全的-这取决于实现。