Sil*_*Fox 16 c# c++ windows security random
请注意,这不是我的应用程序,它是我正在为客户端测试的应用程序.我通常会在https://security.stackexchange.com/上提出这样的问题,但是因为这是我在这里提出的更多编程相关问题.
当然,UUID的RFC 4122没有规定必须由密码安全伪随机数发生器(CSPRNG)生成类型4 UUID.它简单地说
将所有其他位设置为随机(或伪随机)选择的值.
虽然,算法的某些实现(例如Java中的这种实现)确实使用CSPRNG.
我试图深入研究微软的实施是否成功.主要围绕.NET或MSSQL Server如何生成它们.
检查.NET源代码,我们可以看到以下代码:
Marshal.ThrowExceptionForHR(Win32Native.CoCreateGuid(out guid), new IntPtr(-1));
return guid;
Run Code Online (Sandbox Code Playgroud)
检查CoCreateGuid
docco,它说
CoCreateGuid函数调用RPC函数UuidCreate
我能找到关于这个功能的所有内容都在这里.我好像已经到了兔子洞的尽头.
现在,有没有人知道如何UuidCreate
生成其UUID?
我见过很多相关帖子:
第一个说:
GUID不保证随机性,它保证了唯一性.如果您想要随机性,请使用Random生成字符串.
我同意这一点,除了在我的情况下随机,不可预测的数字,你当然使用CSPRNG而不是Random
(例如RNGCryptoServiceProvider
).
而后者的状态(实际上引自维基百科):
WinAPI GUID生成器的密码分析显示,因为V4 GUID的序列是伪随机的; 在完全了解内部状态的情况下,可以预测先前和后续的值
现在,在围栏的另一边,Will Dean说这篇文章
我最后一次研究这个问题(几年前,可能是XP SP2),我直接进入操作系统代码,看看实际发生了什么,并使用安全随机数生成器生成一个随机数.
当然,即使它当前正在使用CSPRNG,这也将是特定于实现的,并且可能随时更改(例如,对Windows的任何更新).不太可能,但理论上可行.
我的观点是,没有规范的参考,以上是为了证明我已经完成了我的研究,上述帖子都没有引用任何权威的内容.
原因是我正在尝试确定是否需要更改使用GUID进行身份验证令牌的系统.从纯粹的设计角度来看,答案肯定是肯定的,但是从实际的角度来看,如果Windows UuidCreate
功能确实使用了CSPRNG,那么系统就没有直接的风险.任何人都可以对此有所了解吗?
我正在寻找有信誉的来源的任何答案来支持它.
Wil*_*ean 15
虽然我仍然只是互联网上的一些人,但我刚刚在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
Run Code Online (Sandbox Code Playgroud)
很明显,它使用基于AES的RNG来生成数字.通过调用其他人的GUID生成函数生成的GUID仍然不适合用作无法使用的auth令牌,因为这不是GUID生成函数的目的 - 您只是在利用副作用.
你的"不太可能,但理论上可行".关于操作系统版本之间的实现更改,请参阅"UuidCreate"文档中的此声明:
如果您不需要此级别的安全性,则您的应用程序可以使用UuidCreateSequential函数,该函数的行为与UuidCreate函数在所有其他版本的操作系统上的行为完全相同.
也就是说它曾经更具可预测性,现在它的可预测性更低.
归档时间: |
|
查看次数: |
1187 次 |
最近记录: |