13

我在网上搜索了多个资源,但到目前为止,对于 Microsoft 的 GUID 生成机制是否足够安全以保证它在应用程序中用作唯一 ID 的问题,我一直无法找到明确的答案。

为了澄清,通过“足够安全”,我的意思是询问用于生成 GUID 的算法是否存在任何已知的弱点或漏洞,这些弱点或漏洞可能会降低 GUID 的有效随机性,即导致不可忽略的冲突次数。如果不是,这是否意味着 GUID 完全不可猜测,如果是,是否有某种方法可以为 GUID 生成器函数播种以有效增加生成的 GUID 的随机性。

根据此处 MSDN 指南 ( http://msdn.microsoft.com/en-us/library/system.guid.aspx ) 中指定的信息,是否有任何迹象表明可以依赖用于生成 GUID 的系统足够随机。

谢谢!

4

2 回答 2

17

我不同意接受的答案。虽然违背 RFC 的建议通常是个坏主意,但在这种情况下,我能够找到 MSDN 文档,指出 Microsoft 确实采取了明显、有用的路线,并将加密安全的 RNG 绑定到 v4 GUID 的生成中:

根据https://msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx,.NET 的 GUID 创建只是包装了 Windows 函数 CoCreateGuid 和 UuidCreate。根据http://download.microsoft.com/download/5/0/1/501ED102-E53F-4CE0-AA6B-B0F93629DDC6/Windows/%5BMS-WSO%5D.pdf,自 1999 年的 Windows 2000 以来,

“Windows 中内置的所有版本 4 GUID 的随机位是通过 Windows CryptGenRandom 加密 API 或等效的,用于生成加密密钥的相同来源获得”

所以我想说你可以称它们为密码安全——至少在它们提供的 122 位熵的范围内。

于 2018-05-28T20:01:29.370 回答
15

不是。Guid 的目标是唯一,但加密安全意味着它是不可预测的。这些目标有时但并非总是一致。

如果你想要加密安全,那么你应该使用类似RNGCryptoServiceProvider 的东西

也可以看看:

上面两个链接的关键点是微软的 Guid 是 UUID 的实现,UUID 规范指出它们不应该用作安全令牌

不要假设 UUID 很难猜;例如,它们不应该用作安全功能(仅拥有授予访问权限的标识符)。一个可预测的随机数源会加剧这种情况。

于 2013-07-01T16:36:29.727 回答