【发布时间】:2016-05-23 19:48:05
【问题描述】:
请注意,这不是 我的 应用程序,它是我正在为客户测试的应用程序。我通常在https://security.stackexchange.com/ 上问这样的问题,但是因为这与编程相关,所以我在这里问过。
当然,UUID 的RFC 4122 没有指定类型 4 UUID 必须由加密安全伪随机数生成器 (CSPRNG) 生成。它只是说
将所有其他位设置为随机(或伪随机)选择 价值观。
尽管该算法的某些实现,例如 this one in Java,确实使用了 CSPRNG。
我试图深入研究 Microsoft 的实施是否有效。主要围绕 .NET 或 MSSQL Server 如何生成它们。
查看.NET source我们可以看到这段代码:
Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
return guid;
检查CoCreateGuid docco,它指出
CoCreateGuid 函数调用 RPC 函数 UuidCreate
我能找到的关于这个函数的只有here。我似乎已经走到了兔子洞的尽头。
现在,有人知道UuidCreate 是如何生成其 UUID 的吗?
我看过很多相关的帖子:
- How Random is System.Guid.NewGuid()? (Take two)
- Is using a GUID a valid way to generate a random string of characters and numbers?
- How securely unguessable are GUIDs?
- how are GUIDs generated in SQL Server?
第一个说:
GUID 不保证随机性,而是保证 围绕独特性。如果你想要随机性,使用 Random 生成一个 字符串。
我同意这一点,但在我的情况下,对于随机的、不可预测的数字,你当然会使用 CSPRNG 而不是 Random(例如 RNGCryptoServiceProvider)。
而后一种说法(实际引自维基百科):
WinAPI GUID 生成器的密码分析表明,由于 V4 GUID 的序列是伪随机的;充分了解 内部状态,可以预测之前和之后的 价值观
现在,在围栏的另一边 this post 来自 Will Dean 说
我上次研究这个(几年前,可能是 XP SP2)时,我 直接进入操作系统代码,看看实际上是什么 正在发生,它正在使用安全生成一个随机数 随机数生成器。
当然,即使它当前使用的是 CSPRNG,这也将是特定于实现的,并且随时可能发生变化(例如,对 Windows 的任何更新)。不太可能,但理论上是可能的。
我的意思是,这没有规范的参考,以上是为了证明我已经完成了我的研究,以上帖子都没有参考任何权威。
原因是我试图决定是否需要更改使用 GUID 进行身份验证令牌的系统。从纯粹的设计角度来看,答案是肯定的是,但是从实际的角度来看,如果 Windows UuidCreate 函数确实使用 CSPRNG,那么系统不会立即面临风险.任何人都可以对此有所了解吗?
我正在寻找任何有可靠来源的答案来支持它。
【问题讨论】:
-
奇怪的问题。假设有人说“是”。您是否要根据互联网上的陌生人告诉您的信息来确定系统的安全性?致电微软。
-
不,我要求以某种方式提供一些证据。例如see my comment here.
-
获取 Windbg 并进入通话,看看它做了什么。然后在某个时间点至少有一个操作系统,您就会知道。指南仍然不适合您使用它们的目的,但您至少可以解决这个问题。
-
这里的主要问题是您盗用 GUID 用于不适合的目的。实现是一个细节,无论当前的实现是什么,它都可能随时被任意更改。
标签: c# c++ windows security random