【问题标题】:RNGCryptoServiceProvider in .Net Core.Net Core 中的 RNGCryptoServiceProvider
【发布时间】:2016-07-28 09:45:25
【问题描述】:

我在 .NetCore 中找不到 System.Security.Cryptography.RNGCryptoServiceProvider 类。

这对于我尝试从 .Net Framework 移植的应用程序来说是必不可少的,因为它被用于生成用于加密的初始化向量。

它是否以不同的名称存在,或者是否有其他方法可以实现此功能?

【问题讨论】:

    标签: cryptography .net-core


    【解决方案1】:

    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)。

    【讨论】:

      【解决方案2】:

      建议的解决方案之一是使用 RandomNumberGenerator.Create() https://github.com/dotnet/corefx/issues/2881

      【讨论】:

      • 这可能是正确的答案,但您需要说明为什么会出现这种情况。例如。 RandomNumberGenerator 是否返回密码安全的随机数?如果是这样,为什么以及如何?请注意,仅链接的答案通常“不受欢迎”。
      【解决方案3】:

      我们可以在 .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;

      希望对您有所帮助。 谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-30
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        • 2016-10-07
        • 2022-01-07
        • 2021-06-06
        相关资源
        最近更新 更多