我已经在线搜索了多个资源,但到目前为止还无法找到一个明确的答案,即微软的GUID生成机制是否足够安全以保证它可以作为整个应用程序的唯一ID使用。
为了澄清,'足够安全',我的意思是询问用于生成GUID的算法是否具有任何已知的弱点或漏洞,这些弱点或漏洞可能会降低GUID 的有效随机性,即。导致无法忽略的碰撞次数。如果不是,这是否意味着GUID是完全不可能的,如果是,是否有某种方法可以为GUID生成器函数设定种子,以有效地增加生成的GUID的随机性。
根据MSDN指南中指定的信息(http://msdn.microsoft.com/en-us/library/system.guid.aspx),有任何迹象表明可以依赖用于生成GUID的系统足够随机。
谢谢!
答案 0 :(得分:8)
没有。 Guid的目标是唯一,但加密安全意味着不可预测。这些目标有时(但并非总是如此)一致。
如果您希望加密安全,那么您应该使用类似RNGCryptoServiceProvider
的内容另见:
以上两个链接的关键点是Microsoft的Guid是UUID的实现,UUID spec indicates that they should not be used as security tokens:
不要以为UUID难以猜测;例如,它们不应被用作安全功能(仅仅拥有访问权限的标识符)。可预测的随机数源会加剧这种情况。
答案 1 :(得分:5)
我不同意接受的答案。虽然反对RFC的建议通常是一个坏主意,但在这种情况下,我能够找到MSDN文档,指明Microsoft确实采用了明显的,有用的路由并将加密安全的RNG绑定到v4 GUID的生成中: / p>
根据https://msdn.microsoft.com/en-us/library/system.guid.newguid(v=vs.110).aspx,.NET的GUID创建只包含Windows函数CoCreateGuid和UuidCreate。根据{{3}},自1999年Windows 2000以来,
“获取Windows中构建的所有版本4 GUID的随机位 通过Windows CryptGenRandom加密API或等效的, 用于生成加密密钥的相同源“
所以我说你可以称它们是加密安全的 - 至少在它们提供的122位熵的范围内。