根据 RandomNumberGenerator 的 MSDN 文档:
Application code does not directly use this class. This abstract class is provided as the base class for all cryptographic random number generators.
For an implementation of a cryptographic random number generator, use the derived class RNGCryptoServiceProvider.
但是,我在不同的代码库中看到了以下代码在一些场合的使用:
byte[] bytes = new byte[...];
RandomNumberGenerator rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
最值得注意的是 StackExchange (我假设包括 SO)以及 BCrypt.Net .
因此,我有点困惑——上面的代码返回的是什么类型的RandomNumberGenerator
?此外,某些代码库使用RandomNumberGenerator
而不是RNGCryptoServiceProvider
是否有点缺陷?
我假设 RandomNumberGenerator.Create()
是在幕后进行的,我在这里完全没有看到,但是从技术上讲(因为它是一个抽象类)上面的代码不应该抛出错误吗?
最佳答案
RandomNumberGenerator.Create()
方法调用 RandomNumberGenerator.Create("System.Security.Cryptography.RandomNumberGenerator")
,最终会创建一个 的实例RNGCryptoServiceProvider
.
(它在一对字典中进行一些查找,因此您很可能可以通过在某处注册默认随机生成器来更改该调用的行为。)
返回对象的实际类型在编译时是未知的,只知道它会继承RandomNumberGenerator
类,所以你可以使用一个RandomNumberGenerator
引用变量
这种根据输入创建不同类型实例的方法在框架中的几个地方使用,例如 WebRequest.Create
方法。
Microsoft 的某人已“修复”了 Create()
方法的当前文档(框架 4.5)。它现在说:
"When overridden in a derived class, creates an instance of the default implementation of a cryptographic random number generator that can be used to generate random data."
框架 4.0 的文档说:
"Creates an instance of the default implementation of a cryptographic random number generator that can be used to generate random data."
这是对方法作用的正确描述。我将请求将该描述放回较新的文档中。
关于c# - RandomNumberGenerator 与 RNGCryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12329760/