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

2024-03-17

对于那些赶时间的人来说,这是NOT与有争议的Dual_EC_DRBG种植在 NIST SP 800-90A 内。

关于两个RING:

  1. Microsoft BCRYPT 层基于其 C API。BCryptGenRandom http://msdn.microsoft.com/en-us/library/windows/desktop/aa375458%28v=vs.85%29.aspx遵循 NIST SP800-90ACTR_DRBG(即使用经批准的分组密码 AES 来创建随机位)。然而,尚不清楚它是否使用硬件随机源作为种子(或种子的一部分)......

  2. 微软.NETRNGCryptoServiceProvider http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx基于 C#。看着.NET源代码 http://referencesource.microsoft.com/netframework.aspx (or here http://www.dotnetframework.org/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/clr/src/BCL/System/Security/Cryptography/RNGCryptoServiceProvider@cs/1305376/RNGCryptoServiceProvider@cs),我看到它最终调用了 C++ 方法CapiNative.GenerateRandomBytes()。应该有一个用于 C#=>C++ 转换的 P/Invoke 存根,但我在框架源代码中找不到它。所以我不知道它是如何实际实现的。

有人有关于这两个随机数生成器的更多信息吗?是否使用硬件随机种子(通过旧英特尔中的二极管噪声或有争议的RDRAND在最新的情报中)。

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


Microsoft .NET RNGCryptoServiceProvider 是基于 C# 的

不完全是这样,托管框架类只是 Windows 内置的 Crypto api 的一个薄包装。所有名称以以下结尾的 System.Security.Cryptography 类ServiceProvider是本机 API 的包装器。名字结尾为Managed以纯托管代码实现。据此,XxxServiceProvider类使用 FIPS 验证的加密技术,并且XxxManaged类不是。

它并不完全是 pinvoke,它使用通用机制在 CLR 代码中直接调用。抖动查阅包含C++函数地址的表并直接编译CALL机器代码指令。该机制描述于这个答案 https://stackoverflow.com/a/8870593/17034。查看实际代码是不可能的,它不包含在 SSCLI20 发行版中,并且已更改为使用 .NET 4 中的 QCall 机制。

因此,该断言无法证明,但 RNGCryptoServiceProvider 和您传递给 BCryptGenRandom() 的算法提供程序很可能使用相同的随机数源。在 Windows 中,它是 advapi.dll 中的未命名导出函数,这个答案 https://stackoverflow.com/a/9575747/17034对其用途进行了很好的总结。

如果这确实与您有关并且您想要reliable信息来源,然后不要从免费的问答网站获取建议来满足您的安全需求。致电微软支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机数生成器安全性:BCryptGenRandom 与 RNGCryptoServiceProvider 的相关文章

随机推荐