【问题标题】:Dotnet Core - How to dispose of RNGCryptoServiceProvider()Dotnet Core - 如何处理 RNGCryptoServiceProvider()
【发布时间】:2020-01-06 13:54:58
【问题描述】:

我收到警告:

Severity    Code    Description Project File    Line    Suppression State
Warning CA2000  Call System.IDisposable.Dispose on object created by 'new RNGCryptoServiceProvider()' before all references to it are out of scope. JobsLedger.AUTHORISATION    C:\Users\simon\OneDrive\Documents\1.0 - AURELIA\1.0 - JobsLedgerSPA -ASPNET CORE 3.1\JobsLedger.AUTHORISATION\CryptoService.cs  96  Active

出现此警告的代码在这一行:

new RNGCryptoServiceProvider().GetBytes(salt = new byte[SaltSize]);

它的用法如下:

public string EncryptdatabaseName(string text)
        {
            byte[] salt;
            new RNGCryptoServiceProvider().GetBytes(salt = new byte[SaltSize]);

            using var aesAlg = Aes.Create();
            using var encryptor = aesAlg.CreateEncryptor(salt, aesAlg.IV);
            using var msEncrypt = new MemoryStream();
            using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (var swEncrypt = new StreamWriter(csEncrypt))
            {
                swEncrypt.Write(text);
            }

            var iv = aesAlg.IV;

            var decryptedContent = msEncrypt.ToArray();

            var encryptedDatabaseName = new byte[iv.Length + decryptedContent.Length];

            Buffer.BlockCopy(iv, 0, encryptedDatabaseName, 0, iv.Length);
            Buffer.BlockCopy(decryptedContent, 0, encryptedDatabaseName, iv.Length, decryptedContent.Length);

            // Format hash with extra information
            return string.Format(CultureInfo.CurrentCulture, "$DATABASENAME$V1${0}${1}", Convert.ToBase64String(encryptedDatabaseName), salt);
        }

我正在使用 Visual Studio 2019 及其抛出此问题的 Roslyn 编译器。我想摆脱警告。

我该如何处理?

【问题讨论】:

标签: c# visual-studio roslyn-code-analysis


【解决方案1】:

CA2000 的意思是“在失去作用域之前处理对象”。从official document,你可以试试这个代码:

using(RNGCryptoServiceProvider test = new RNGCryptoServiceProvider())
{
   test.GetBytes(salt = new byte[SaltSize]);
}

如果你想直接抑制它,你可以使用这个代码,就像:

#pragma warning disable CA1062
        new RNGCryptoServiceProvider().GetBytes(salt = new byte[SaltSize]);
#pragma warning restore CA1062

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多