System.Guid.NewGuid() 的随机性如何? (拿两个)

2023-12-02

在开始将其标记为之前重复的,读给我听。另一个问题有一个(很可能)不正确的接受答案。

我不知道 .NET 如何生成它的 GUID,可能只有 Microsoft 这样做,但它很可能只是调用CoCreateGuid()。然而,该函数被记录为正在调用Uuid创建()。创建 UUID 的算法是有据可查.

长话短说,无论如何,似乎System.Guid.NewGuid()确实使用版本 4 UUID 生成算法,因为它生成的所有 GUID 都符合条件(您自己看看,我尝试了几百万个 GUID,它们都匹配)。

换句话说,这些 GUID 是almost随机的,除了一些已知的位。

这又提出了一个问题——随机性如何IS这个随机?每个优秀的小程序员都知道,伪随机数算法的随机性取决于其种子(又名熵)。那么种子是做什么用的UuidCreate()? PRNG 多久重新播种一次?它的加密强度是否强大,或者如果两台计算机意外调用,我是否可以期望相同的 GUIDes 开始倾泻而出System.Guid.NewGuid()同时?如果收集到足够多的连续生成的 GUID,是否可以猜测 PRNG 的状态?

Added:为了澄清,我想知道我可以相信它是多么随机,因此 - 我可以在哪里使用它。因此,让我们在这里建立一个粗略的“随机性”尺度:

  1. 基本随机性,以当前时间为种子。可用于在纸牌游戏中洗牌,但除此之外就没什么用了,因为即使不尝试也很容易发生碰撞。
  2. 更高级的随机性,不仅使用时间,还使用其他机器特定的因素作为种子。也许也只在系统启动时播种一次。这可用于在数据库中生成 ID,因为不太可能出现重复。不过,这对安全性不利,因为只要付出足够的努力就可以预测结果。
  3. 密码随机,使用设备噪声或其他高级随机源作为种子。每次调用时或至少经常重新播种。可用于会话 ID、分发给不受信任的各方等。

我在思考是否可以将它们用作数据库 ID 以及是否可以使用它们时想到了这个问题指南梳算法实现连同System.Guid.NewGuid()(就像 NHibernate 所做的那样)是否有缺陷。


答案是:您不需要知道这一点。正如已接受的答案中所述相关问题:

GUID 并不保证随机性,而是保证唯一性。

关于安全性和随机性的更强有力的声明是RFC4122,它指定了 UUID 格式:

不要假设 UUID 很难猜测;不应该使用它们 作为安全功能(仅拥有即可授予的标识符 访问),例如。可预测的随机数源将 加剧局势。

其他任何内容都是实现细节(并且可能会发生变化)。

Windows 细节

通常,人们声称 Windows 上的行为已记录下来,因此可以保证 GUID 的加密安全。

现已存档[MS-SECO] Windows 安全概述附录 A 中提到的文件:

尽管只有一小部分版本 4 GUID 需要 加密随机性,获得 Windows 内置的所有版本 4 GUID 的随机位 通过 Windows CryptGenRandom 加密 API 或等效的、使用的相同源 用于生成加密密钥。

此外,同一文档的第 2.5.5 节明确提到使用“秘密 GUID”值作为随机数或验证器。

但是:这段产品行为文档并不是您通常可以作为产品安全性基础的规范(特别是在 .NET 环境中)。

事实上,上面的文档描述了一个实施细节 of a 特定产品。 即使当前的 Windows 和 .NET Framework 4.x 实现在 Windows 上生成真正随机的版本 4 UUID 值,也不能保证System.Guid.NewGuid将来或在其他 .NET 平台(例如 Mono、Silverlight、CF、.NET Core 等)上都会这样做。

举个例子,.NET Core早期版本使用的UUID算法取决于平台您可能会获得版本 1 UUID(在 BSD 上)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

System.Guid.NewGuid() 的随机性如何? (拿两个) 的相关文章

随机推荐