gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:38:48 44 4
gpt4 key购买 nike

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

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

长话短说,尽管如此,System.Guid.NewGuid() 似乎确实使用 version 4 UUID generation algorithm ,因为它生成的所有 GUID 都符合条件(您自己看看,我尝试了几百万个 GUID,它们都匹配)。

换句话说,除了一些已知位之外,这些 GUID几乎是随机的。

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

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

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

我在思考是否可以将它们用作数据库 ID 以及 Guid.comb 是否可以时提出了这个问题。与 System.Guid.NewGuid() 一起实现的算法(就像 NHibernate 所做的那样)是否存在缺陷。

最佳答案

答案是:您不需要知道这一点。正如对 related question 的接受答案中所述:

A GUID doesn't make guarantees about randomness, it makes guarantees around uniqueness.

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

Do not assume that UUIDs are hard to guess; they should not be usedas security capabilities (identifiers whose mere possession grantsaccess), for example. A predictable random number source willexacerbate the situation.

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

Windows 细节

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

现已存档[MS-SECO] Windows Security Overview附录 A 中提到的文档:

Although only a small minority of version 4 GUIDs requirecryptographic randomness, the random bits for all version 4 GUIDs built in Windows are obtainedvia the Windows CryptGenRandom cryptographic API or the equivalent, the same source that is usedfor generation of cryptographic keys.

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

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

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

举个例子,早期版本的.NET Core中使用的UUID算法depends on the platform您可能会获得版本 1 UUID(在 BSD 上)。

关于.net - System.Guid.NewGuid() 的随机性如何? (拿两个),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2621563/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com