UuidCreate是否使用CSPRNG

本文关键字:CSPRNG 是否 UuidCreate | 更新日期: 2023-09-27 18:34:19

请注意,这不是我的应用程序,而是我正在为客户进行渗透测试的应用程序。我通常会在 https://security.stackexchange.com/上问这样的问题,但是由于这与编程更相关,我在这里问过。

当然,用于 UUID 的 RFC 4122 并未指定类型 4 UUID 必须由加密安全伪随机数生成器 (CSPRNG( 生成。它只是说

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

虽然,该算法的某些实现,例如Java中的这个,确实使用了CSPRNG。

我试图深入研究Microsoft的实现是否这样做。 主要是围绕.NET或MSSQL Server如何生成它们。

检查 .NET 源代码,我们可以看到以下代码:

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

检查CoCreateGuid文档,它指出

CoCreateGuid 函数调用 RPC 函数 UuidCreate

我能找到的关于这个功能的所有信息都在这里。我好像已经到了兔子洞的尽头。

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

我看过很多相关帖子:

  • System.Guid.NewGuid((的随机性如何?(拿两个(
  • 使用 GUID 是否是生成随机字符串和数字的有效方法?
  • GUID 的不可猜测性有多大?
  • 如何在 SQL Server 中生成 GUID?

其中第一个说:

GUID 不保证随机性,它保证 围绕独特性。如果需要随机性,请使用随机生成 字符串。

我同意这一点,除非在我的情况下,对于随机的、不可预测的数字,你当然会使用 CSPRNG 而不是Random(例如 RNGCryptoServiceProvider (。

后者声明(实际上引用自维基百科(:

WinAPI GUID 生成器的密码分析表明,由于 V4 GUID 的序列是伪随机的;充分了解 内部状态,可以预测之前和之后 值

现在,在栅栏的另一边,威尔·迪恩的这篇文章说

最后一次研究这个(几年前,可能是XP SP2(,我 直接进入操作系统代码以查看实际内容 发生,并且它正在生成一个带有安全的随机数 随机数生成器。

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

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

原因是我正在尝试决定是否需要使用 GUID 作为身份验证令牌的系统进行更改。从纯粹的设计角度来看,答案是肯定的,但是从实际的角度来看,如果Windows UuidCreate功能确实使用了CSPRNG,那么系统就不会有直接的风险。谁能对此有所了解?

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

UuidCreate是否使用CSPRNG

虽然我仍然只是互联网上的某个人,但我刚刚在运行在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 仍然不适合用作不可猜测的身份验证令牌,因为这不是 GUID 生成函数的目的 - 你只是在利用副作用。

你"不太可能,但理论上可能"关于操作系统版本之间实现的变化,而是在"UuidCreate"文档中的以下陈述中给出了谎言:

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

也就是说,它

曾经更容易预测,现在它更不可预测。