【问题标题】:How are .NET 4 GUIDs generated?.NET 4 GUID 是如何生成的?
【发布时间】:2011-02-15 00:29:09
【问题描述】:

我知道有很多问题here 以及 Raymond 的出色(和往常一样)post。然而,由于创建 GUID 的算法明显改变,我发现很难掌握任何最新信息。 MSDN 似乎试图提供尽可能少的信息。

关于如何在 .NET 4 中生成 GUID 有哪些已知信息?发生了什么变化,它如何影响安全性(“随机性”)和完整性(“唯一性”)?

我感兴趣的一个特定方面:在 v1 中,似乎不可能再次在单台机器上生成相同的 GUID,因为涉及时间戳和计数器。在 v4 中,情况不再如此(有人告诉我),因此有机会在单台机器上获得相同的 GUID ...增加了

【问题讨论】:

    标签: .net .net-4.0 guid


    【解决方案1】:

    由于Windows 2000微软使用的是第4版算法:

    在 Windows 2000 中,Microsoft 切换到版本 4 GUID,因为嵌入 MAC 地址被视为安全风险。 1

    您也可以从 .NET 中生成的 GUID(来自 Wikipedia)中看到这一点:

    第 4 版 UUID 的格式为 xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx,其中 x 可以是任何十六进制数字,但 y 只能是 8、9、A 或 B 之一。例如f47ac10b-58cc-4372-a567-0e02b2c3d479。

    版本 4 UUID 由 122 个有效位组成,提供 2^122 个不同的值,这是一个 非常 大的数字。给定一组 H 值,在以 50% 的几率找到第一个随机碰撞之前我们必须选择的预期值的数量可以计算如下(参见维基百科上的 Birthday Attack):

    2^122 个不同值的结果(生日界限)约为 2,89e+18。这假设生成的值是随机分布的。显然,如果值分布不均匀,可以更快地找到随机碰撞。更多详情请参见Random UUID probability of duplicates

    1事实上,Melissa 蠕虫的作者可能是tracked down,这是由于使用版本 1 算法生成的 GUID。

    【讨论】:

    • +1 - GUID 由底层操作系统生成 - 而不是 .NET。 .NET 类只是包装了底层 OS API。
    • 感谢您的回答和附加链接,它澄清了我的大部分问题。你知道我在最后一段中所做的假设是否正确吗?
    • Dirk,您能否说明这是否也适用于 .NET 核心?我们是否需要查看任何运行 .NET 核心的操作系统 API 才能找出 GUID 生成版本?
    • 根据msdn.microsoft.com/en-us/library/…,自 1999 年的 Windows 2000 以来,“Windows 中内置的所有版本 4 GUID 的随机位都是通过 Windows CryptGenRandom 加密 API 或等效的,与用于生成加密密钥”。所以我想说你可以称它们为密码安全——至少在它们提供的 122 位熵的范围内。
    • @JordanRieger:您的陈述可能是正确的,但您不应忘记 RFC4122 的第 6 节非常清楚您应该对 UUID 值的随机性(包括版本 4)的假设:tools.ietf.org/html/rfc4122#section-6 “不要假设 UUID 很难猜测;它们不应该被用作安全功能”——因此规范明确指出你不应该认为 UUID 具有加密安全性(即使实际的实现会保证)。
    【解决方案2】:

    是的,.NET 4.0 中发生了变化,Guid.NewGuid() 直接调用 CoCreateGuid(),这是 UuidCreate() 的一个小包装器。 .NET 的早期版本在 CLR 中调用了一个帮助函数 GuidNative::CompleteGuid()。它调用 CoCreateGuid。不知道为什么要进行此更改,闻起来只不过是一个小优化。

    无论如何,完全相同的 Windows 函数生成 Guid,算法在过去 10 年中一直相同,它一如既往地可靠。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-05
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 2011-03-11
      相关资源
      最近更新 更多