【发布时间】:2016-07-28 09:45:25
【问题描述】:
我在 .NetCore 中找不到 System.Security.Cryptography.RNGCryptoServiceProvider 类。
这对于我尝试从 .Net Framework 移植的应用程序来说是必不可少的,因为它被用于生成用于加密的初始化向量。
它是否以不同的名称存在,或者是否有其他方法可以实现此功能?
【问题讨论】:
我在 .NetCore 中找不到 System.Security.Cryptography.RNGCryptoServiceProvider 类。
这对于我尝试从 .Net Framework 移植的应用程序来说是必不可少的,因为它被用于生成用于加密的初始化向量。
它是否以不同的名称存在,或者是否有其他方法可以实现此功能?
【问题讨论】:
System.Security.Cryptography.RandomNumberGenerator 是加密安全伪随机数生成器 (CSPRNG) 实现的基类。在 .NET Framework 中,RandomNumberGenerator.Create() 返回一个RNGCryptoServiceProvider 实例(除非CryptoConfig 以不同方式配置)。在 .NET Core 中,RandomNumberGenerator.Create() 返回基于 BCryptGenRandom (Windows) 或 OpenSSL 的随机数生成器 (!Windows) 的不透明类型。
RandomNumberGenerator.Create() 是在 .NET Core 上获取 RNG 实例的唯一方法,因为它同时适用于 .NET Core 和 .NET Framework,所以是最便携的。
当然,如果您正在生成 IV,您也可以只调用实例方法SymmetricAlgorithm.GenerateIV() 使其在内部使用 CSPRNG;虽然正如文档所说,调用它是不必要的,因为随机 IV 是随实例创建的(GenerateIV 可用于强制它在下次调用 CreateEncryptor 之前生成一个新的 IV)。
【讨论】:
建议的解决方案之一是使用 RandomNumberGenerator.Create() https://github.com/dotnet/corefx/issues/2881
【讨论】:
RandomNumberGenerator 是否返回密码安全的随机数?如果是这样,为什么以及如何?请注意,仅链接的答案通常“不受欢迎”。
我们可以在 .Net 核心中这样做。它对我有用。
RNGCryptoServiceProvider provider = new RNGCryptoServiceProvider();
var byteArray = new byte[4];
provider.GetBytes(byteArray);
//convert 4 bytes to an integer
var randomInteger = BitConverter.ToUInt32(byteArray, 0);
它存在于命名空间下:System.Security.Cryptography
在你的类中添加这个以使用该方法: 使用 System.Security.Cryptography;
希望对您有所帮助。 谢谢
【讨论】: