UuidCreate是否使用CSPRNG?

时间:2016-02-12 15:31:37

标签: c# c++ windows security random

请注意,这不是我的应用程序,它是我正在为客户端进行测试的应用程序。我通常会在https://security.stackexchange.com/上提出这样的问题,但是因为这是我在这里提出的更多与编程有关的问题。

当然,对于UUID,RFC 4122没有指定必须由密码安全伪随机数生成器(CSPRNG)生成类型4 UUID。它只是说

  

将所有其他位设置为随机(或伪随机)         值。

虽然该算法的某些实现(例如this one in Java)确实使用了CSPRNG。

我试图深入研究微软的实施是否成功。主要围绕.NET或MSSQL Server如何生成它们。

检查.NET source我们可以看到此代码:

 Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
 return guid;

检查CoCreateGuid docco,它说明了

  

CoCreateGuid函数调用RPC函数UuidCreate

我可以找到关于此功能的所有内容here。我似乎已经到了兔子洞的尽头。

现在,有没有人知道UuidCreate如何生成其UUID?

我看过许多相关帖子:

第一个说:

  

GUID不保证随机性,它提供保证   围绕着独特性。如果您想要随机性,请使用Random生成一个   字符串。

我同意这一点,但在我的情况下,对于随机,不可预测的数字,您当然使用CSPRNG代替Random(例如RNGCryptoServiceProvider)。

后者表示(实际上引自维基百科):

  

WinAPI GUID生成器的密码分析显示,因为   V4 GUID序列是伪随机的;充分了解   内部状态,可以预测前一个和后一个   值

现在,在Will Dean的栅栏的另一边this post上说

  

我最后一次调查(几年前,可能是XP SP2),我   直接进入操作系统代码,看看实际上是什么   正在发生,它正在生成一个带有安全性的随机数   随机数发生器。

当然,即使它当前正在使用CSPRNG,这也将是特定于实现的,并且可能随时更改(例如,对Windows的任何更新)。不太可能,但理论上可行。

我的观点是,这里没有规范性的参考,以上是为了证明我已经完成了我的研究,上述帖子都没有引用任何权威的内容。

原因是我试图决定是否需要更改使用GUID进行身份验证令牌的系统。从纯粹的设计角度来看,答案是明确的,但是从实际的角度来看,如果Windows UuidCreate函数确实使用了CSPRNG,那么就没有直接的风险系统。任何人都可以对此有所了解吗?

我正在寻找有信誉的来源的任何答案来支持它。

1 个答案:

答案 0 :(得分:13)

虽然我仍然只是互联网上的一些人,但我刚刚在64位版本的Windows 10上运行的32位应用程序中重复使用UuidCreate。

这是从过程到过程的一些堆栈:

> 0018f670 7419b886 bcryptPrimitives!SymCryptAesExpandKeyInternal+0x7f
> 0018f884 7419b803 bcryptPrimitives!SymCryptRngAesGenerateSmall+0x68
> 0018f89c 7419ac08 bcryptPrimitives!SymCryptRngAesGenerate+0x3b
> 0018f8fc 7419aaae bcryptPrimitives!AesRNGState_generate+0x132 
> 0018f92c 748346f1 bcryptPrimitives!ProcessPrng+0x4e 
> 0018f93c 748346a1 RPCRT4!GenerateRandomNumber+0x11
> 0018f950 00dd127a RPCRT4!UuidCreate+0x11

很明显,它使用基于AES的RNG来生成数字。通过调用其他人的GUID生成函数生成的GUID仍然不适合用作无法使用的auth令牌,因为这不是GUID生成函数的目的 - 您只是在利用副作用。

你的“不太可能,但理论上可行”。关于操作系统版本之间的实现更改,请参阅“UuidCreate”文档中的此声明:

  

如果您不需要此级别的安全性,您的应用程序可以使用UuidCreateSequential函数,该函数的行为与UuidCreate函数在所有其他版本的操作系统上的行为完全相同。

即。它曾经更具可预测性,现在它的可预测性更低。