【问题标题】:Are there any inobvious ways of abusing GUIDs?是否有任何不明显的滥用 GUID 的方法?
【发布时间】:2009-12-15 22:00:27
【问题描述】:

GUID 通常用于唯一标识各种实体 - 来自外部系统、文件等的请求。像魔术一样工作 - 您调用“GiveMeGuid()”(Windows 上的 UuidCreate())函数 - 一个全新的 GUID 随时为您服务。

鉴于我的代码每次我需要一个新的 GUID 时都会调用“GiveMeGuid()”函数,是否有任何不那么明显的方式来滥用它?

【问题讨论】:

  • 一切正常。或者有什么你想解决的问题?
  • 你不会很快用完 GUID =)
  • “误用”是什么意思? Guid 只是一个值,您可以以任何您想要的方式使用它,就像任何其他值一样。您调用的函数只是进行某些计算(几乎)保证该值是唯一的,我认为它不会被滥用。
  • @Tobu:我确实在我的应用程序设计中寻找值得关注的东西。就像我们为每个新请求分配一个新的 GUID。可能是如果请求来得太频繁并且资源短缺并且月相错误,我们会得到重复吗?类似的东西,但当然是正常的推理。
  • 可能有不好的 GUID 生成器,但是一旦你有了一个好的 GUID,你的 GUID 就是全局且唯一的,我不知道如何滥用它。

标签: language-agnostic guid


【解决方案1】:

刚刚找到一个老问题的答案:How deterministic Are .Net GUIDs?。重新引用它:

这不是一个完整的答案,但我可以告诉你,第 13 个十六进制数字始终为 4,因为它表示用于生成 GUID 的算法版本(id est,v4);另外,我引用维基百科:

对 WinAPI GUID 生成器的密码分析表明,由于 V4 GUID 的序列是伪随机的,因此在初始状态下,可以预测函数 UuidCreate 返回的下一个 250 000 个 GUID。这就是为什么不应在密码学中使用 GUID,例如作为随机密钥。

所以,如果你幸运地获得相同的种子,你将依次打破 25 万个镜像。引用另一个Wikipedia piece

虽然不能保证每个生成的 GUID 都是唯一的,但唯一键的总数(2128 或 3.4×1038)是如此之大,以至于相同的数字生成两次非常少。

底线:可能是一种误用形式,它认为 GUID始终是唯一的。

【讨论】:

  • 维基百科的说法被证明是错误的:您只能通过访问生成器的完整内部状态来做出这些预测,而不是从 GUID 列表中。
【解决方案2】:

这取决于。 GUID 生成的一些实现是依赖于时间的,因此快速连续调用 CreateGuid 可能会创建冲突的 GUID。

编辑:我现在记住了这个问题。我曾经在编写一些 php 代码,其中 GUID 生成函数在每次调用时使用系统时间重新播种 RNG。不要这样做。

【讨论】:

    【解决方案3】:

    我认为滥用 Guid 的唯一方法是尝试以某种合乎逻辑的方式解释值。并不是说它真的邀请您这样做,这是我非常喜欢 Guid 的特点之一。

    【讨论】:

      【解决方案4】:

      一些 GUID 包含生成它的机器的一些标识符,因此它可以在客户端/服务器环境中使用,但有些则不能。确保你的不使用它们,例如,多个客户端访问的数据库。

      【讨论】:

        【解决方案5】:

        也许可以通过首先使用一些用于生成 GUID 的参数(例如接口标识符)来操纵熵。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-17
          • 2014-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多