根据 MSDN 文档随机数生成器 http://msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator%28v=VS.71%29.aspx:
应用程序代码不直接使用此类。该抽象类作为所有加密随机数生成器的基类提供。
对于加密随机数生成器的实现,请使用派生类 RNGCryptoServiceProvider。
但是,我在不同的代码库中多次看到使用了以下代码:
byte[] bytes = new byte[...];
RandomNumberGenerator rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
最值得注意的是堆栈交换 http://code.google.com/p/stackid/source/browse/OpenIdProvider/Current.cs#1135(我认为包括SO)以及BCrypt.Net http://bcrypt.codeplex.com/SourceControl/changeset/view/1eef0262901c#BCrypt.Net/BCrypt.cs.
因此,我有点困惑——什么类型的RandomNumberGenerator
上面的代码返回了吗?某些代码库也有一点缺陷are using RandomNumberGenerator
而不是RNGCryptoServiceProvider
?
我假设RandomNumberGenerator.Create()
正在幕后做这件事,我在这里完全错过了,但从技术上讲(因为它是一个抽象类)上面的代码不应该抛出错误吗?
The RandomNumberGenerator.Create()
方法调用RandomNumberGenerator.Create("System.Security.Cryptography.RandomNumberGenerator")
,最终将创建一个实例RNGCryptoServiceProvider
.
(它在一对字典中进行一些查找,因此您可能可以通过在某处注册默认随机生成器来更改该调用的行为。)
返回对象的实际类型在编译时是未知的,只知道它将继承RandomNumberGenerator
类,所以你可以使用RandomNumberGenerator
它的参考变量。
这种根据输入创建不同类型实例的方法在框架中的几个地方使用,例如WebRequest.Create
method.
Microsoft 的某人已“修复”了当前文档(框架 4.5)Create()
方法。现在它说:
“当在派生类中重写时,创建一个实例
加密随机数生成器的默认实现
可用于生成随机数据。”
框架 4.0 的文档说:
“创建加密默认实现的实例
可用于生成随机数据的随机数生成器。”
这是对该方法功能的正确描述。我将请求将该描述放回到新的文档中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)