RandomNumberGenerator与RNGCryptoServiceProvider

Jam*_*mes 13 c# random cryptography

根据RandomNumberGenerator的 MSDN文档:

应用程序代码不直接使用此类.此抽象类作为所有加密随机数生成器的基类提供.

对于加密随机数生成器的实现,请使用派生类RNGCryptoServiceProvider.

但是,我看到以下代码在不同代码库中的几个场景中使用:

byte[] bytes = new byte[...];
RandomNumberGenerator rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
Run Code Online (Sandbox Code Playgroud)

最值得注意的是StackExchange(我假设包含SO)以及BCrypt.Net.

因此,我有点困惑 - RandomNumberGenerator上面代码返回的是什么类型的?还有一些代码库正在使用RandomNumberGenerator而不是RNGCryptoServiceProvider

我认为RandomNumberGenerator.Create()这是我在这里完全缺失的引擎盖,但从技术上讲(因为它是一个抽象类)不应该上面的代码抛出错误?

Guf*_*ffa 18

RandomNumberGenerator.Create()方法调用RandomNumberGenerator.Create("System.Security.Cryptography.RandomNumberGenerator"),最终将创造的一个实例RNGCryptoServiceProvider.

(它在一对字典中进行一些查找,因此您可以通过在某处注册默认随机生成器来更改该调用的方法.)

对象的实际类型返回在编译的时候不知道,它只是知道它会继承RandomNumberGenerator类,所以你可以使用一个RandomNumberGenerator参考变量它.

这种根据输入创建不同类型的实例的方式在框架中的几个地方使用,例如通过该WebRequest.Create方法.


Micrsoft的某个人已"修复"该方法的当前文档(框架4.5)Create().它现在说:

"在派生类中重写时,创建一个可用于生成随机数据的加密随机数生成器的默认实现的实例."

框架4.0的文档说:

"创建可用于生成随机数据的加密随机数生成器的默认实现的实例."

这是该方法的正确描述.我将提出将该描述放回到较新文档中的请求.

  • @James:根据目前所知,默认RNG是最佳选择.在将来的框架中,`RNGCryptoServiceProvider`可以被不同的实现替换,然后`Create()`方法将返回它.如果发现`RNGCryptoServiceProvider`太弱,你可能想要创建一个特定的提供者,但现在你无法做到这一点,因此使用`Create()`方法是最具前瞻性的解决方案. (4认同)