c# - RandomNumberGenerator 与 RNGCryptoServiceProvider

标签 c# random cryptography

根据 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/

相关文章:

c++ - 尝试生成随机变量时获取 "-nan(ind)"

java - 使用 BouncycaSTLe 生成数字证书

C#:为迭代正确锁定队列

c# - 如何创建动态查询?

C# 更改列表中的对象

c# - 如何调试 Xamarin.Forms XAML

javascript - 如何在 Javascript 中生成偏态随机数?

python - np.random.permutation, np.random.choice 的时间表现

zend-framework - Zend_Crypt_DiffieHellman - 用法示例

javascript - 使用 PHP 产生与 CryptoJS.enc.Base64 相同的结果