随机数生成器安全性:BCryptGenRandom 与 RNGCryptoServiceProvider

Dee*_*101 4 .net c# security random cryptography

对于那些赶时间,这是相关的争议Dual_EC_DRBG埋下NIST的SP800-90A内。

关于两个RNG:

  1. Microsoft BCRYPT 层基于他们的 C API。BCryptGenRandom遵循 NIST SP800-90A CTR_DRBG(即使用经批准的分组密码 AES 来创建随机位)。但是,尚不清楚它是否使用硬件随机源作为种子(或种子的一部分)......

  2. Microsoft .NETRNGCryptoServiceProvider是基于 C# 的。查看.NET 源代码(或此处),我看到它最终调用了 C++ 方法CapiNative.GenerateRandomBytes()。C#=>C++ 转换应该有一个 P/Invoke 存根,但我在框架源代码中的任何地方都找不到它。所以我不知道它是如何实际实施的。

有没有人有关于这两个随机数生成器的其他信息?是否使用 HW 随机种子(通过旧英特尔中的二极管噪声或RDRAND最新英特尔中的争议)。

PS:不确定这应该在安全、StackOverflow 或密码学...

Han*_*ant 5

Microsoft .NET RNGCryptoServiceProvider 是一个基于 C# 的

不完全是,托管框架类只是 Windows 内置的 Crypto api 的一个瘦包装器。名称以 结尾的所有 System.Security.Cryptography 类ServiceProvider都是本机 API 的包装器。名称以 结尾的那些Managed是在纯托管代码中实现的。因此,这些XxxServiceProvider类使用 FIPS 验证的密码学,而这些XxxManaged类则不是。

它不完全是 pinvoke,它使用通用机制在 CLR 代码中进行直接调用。抖动查询包含 C++ 函数地址的表,并直接编译 CALL 机器代码指令。此答案中描述了该机制。无法查看实际代码,它未包含在 SSCLI20 发行版中,并且已更改为使用 .NET 4 中的 QCall 机制。

所以这个断言是不可证明的,但很有可能 RNGCryptoServiceProvider 和你传递给 BCryptGenRandom() 的算法提供者使用相同的随机数来源。在 Windows 中是 advapi.dll 中的一个未命名的导出函数,这个答案很好地总结了它的用途。

如果这确实与您有关并且您想要可靠的信息来源,那么就不要为了您的安全需要而从免费的 Q+A 网站上寻求建议。致电 Microsoft 支持。