首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机数生成器安全性: BCryptGenRandom与RNGCryptoServiceProvider

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

Stack Overflow用户
提问于 2013-10-05 18:52:02
回答 2查看 6K关注 0票数 4

对于那些匆忙的人来说,这是,而不是,它与NIST SP800-90A中有争议的Dual_EC_DRBG有关。

关于这两件事:

  1. 微软的BCRYPT层是基于他们的C API之上的。BCryptGenRandom正在遵循NISTSP800-90A的CTR_DRBG (即使用已批准的分组密码AES来创建随机比特)。但是,不清楚它是否使用硬件随机源作为种子(或种子的一部分).
  2. 微软的.NET RNGCryptoServiceProvider是基于C#的。查看.NET源代码 (或这里),我看到它最终调用了C++方法CapiNative.GenerateRandomBytes()。C#=>C++转换应该有一个P/Invoke存根,但是我在框架源代码中找不到它。所以我不知道它是如何实现的。

有人对这两个随机数发生器有更多的信息吗?做任何一种/两者都使用HW随机种子(通过二极管噪音在较老的英特尔或争议的RDRAND在最新的英特尔)。

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

EN

回答 2

Stack Overflow用户

发布于 2013-10-05 20:25:12

Microsoft .NET RNGCryptoServiceProvider是基于C#的。

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

它并不完全是pinvoke,它使用一种通用机制在CLR代码中进行直接调用。抖动参考具有C++函数地址的表,并直接编译调用机代码指令。该机制在这个答案中进行了描述。看一看实际的代码是不可能的,它没有包含在SSCLI20发行版中,而是被修改为在.NET 4中使用QCall机制。

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

如果这真的关系到你和你想要一个可靠的信息来源,那么就不要从一个免费的Q+A网站为你的安全需要听取建议。打电话给微软支持。

票数 5
EN

Stack Overflow用户

发布于 2013-10-06 10:36:28

Microsoft RNGCryptoServiceProviderRFC 4086中有提及。

7.1.3.Windows CryptGenRandom 微软向广泛部署的Windows操作系统的用户推荐使用CryptGenRandom伪随机数生成调用和CryptAPI加密服务提供商。这需要一个密码服务提供者库的句柄,一个指向调用方可以提供熵并返回生成的伪随机性的缓冲区的指针,并指示需要多少八位数的随机性。 Windows加密服务提供程序向每个用户存储种子状态变量。当调用CryptGenRandom时,这与调用中提供的任意随机性以及各种系统和用户数据(如进程ID、线程ID、系统时钟、系统时间、系统计数器、内存状态、空闲磁盘集群和散列用户环境块)相结合。这些数据都被输入到SHA-1中,输出被用来为RC4密钥流注入种子。该密钥流用于产生请求的伪随机数据和更新用户的种子状态变量。 Windows ".NET“的用户可能会发现使用RNGCryptoServiceProvider.GetBytes方法界面更容易。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19201461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档