Condividi tramite


CA5390: Non codificare la chiave di crittografia direttamente nel codice

Proprietà valore
ID regola CA5390
Title Non codificare la chiave di crittografia in modo fisso
Categoria Sicurezza
La correzione causa un'interruzione o meno Non rompente
Abilitato per impostazione predefinita in .NET 10 No
Linguaggi applicabili C# e Visual Basic

Causa

Il parametro key del costruttore System.Security.Cryptography.AesCcm o System.Security.Cryptography.AesGcm, della proprietà System.Security.Cryptography.SymmetricAlgorithm.Key, o il parametro rgbKey del metodo System.Security.Cryptography.SymmetricAlgorithm.CreateEncryptor o System.Security.Cryptography.SymmetricAlgorithm.CreateDecryptor è codificato staticamente da uno dei seguenti elementi:

Per impostazione predefinita, questa regola analizza l'intera codebase, ma è configurabile.

Descrizione regola

Affinché un algoritmo simmetrico abbia esito positivo, la chiave privata deve essere nota solo al mittente e al ricevitore. Quando una chiave è codificata in modo permanente, viene facilmente individuata. Anche con i file binari compilati, è facile per gli utenti malintenzionati estrarlo. Una volta compromessa la chiave privata, il testo crittografato può essere decrittografato direttamente e non è più protetto.

Come correggere le violazioni

  • Prendere in considerazione la riprogettazione dell'applicazione per l'uso di un sistema di gestione delle chiavi sicuro, ad esempio Azure Key Vault.
  • Mantenere le credenziali e le chiavi in una posizione sicura separata dal codice sorgente.

Quando eliminare gli avvisi

Non sopprimere un avviso da questa regola.

Configurare il codice da analizzare

Usare le opzioni seguenti per configurare le parti della codebase in cui eseguire questa regola.

È possibile configurare queste opzioni solo per questa regola, per tutte le regole a cui si applicano o per tutte le regole di questa categoria (Sicurezza) a cui si applicano. Per altre informazioni, vedere Opzioni di configurazione delle regole di qualità del codice.

Escludere simboli specifici

È possibile escludere simboli specifici, ad esempio tipi e metodi, dall'analisi impostando l'opzione excluded_symbol_names. Ad esempio, per specificare che la regola non deve essere eseguita in alcun codice all'interno di tipi denominati MyType, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Nota

Sostituire la parte XXXX di CAXXXX con l'ID della regola applicabile.

Formati di nome simbolo consentiti nel valore dell'opzione (separati da |):

  • Solo nome simbolo (include tutti i simboli con il nome, indipendentemente dal tipo o dallo spazio dei nomi contenitore).
  • Nomi completi nel formato dell'ID della documentazione del simbolo. Ogni nome di simbolo richiede un prefisso di tipo di simbolo, ad esempio M: per i metodi, T: per i tipi e N: per i namespace.
  • .ctor per costruttori e .cctor per costruttori statici.

Esempi:

Valore opzione Riepilogo
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Corrisponde a tutti i simboli denominati MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Corrisponde a tutti i simboli denominati MyType1 o MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Corrisponde a un metodo MyMethod specifico con la firma completa specificata.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Abbina metodi specifici MyMethod1 e MyMethod2 con le rispettive firme complete.

Escludere tipi specifici e i relativi tipi derivati

È possibile escludere tipi specifici e i relativi tipi derivati dall'analisi impostando l'opzione excluded_type_names_with_derived_types. Ad esempio, per specificare che la regola non deve essere eseguita in alcun metodo all'interno di tipi denominati MyType e dei relativi tipi derivati, aggiungere la coppia chiave-valore seguente a un file con estensione editorconfig nel progetto:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Nota

Sostituire la parte XXXX di CAXXXX con l'ID della regola applicabile.

Formati di nome simbolo consentiti nel valore dell'opzione (separati da |):

  • Solo nome di tipo (include tutti i tipi con il nome, indipendentemente dal tipo o dallo spazio dei nomi contenitore).
  • Nomi completi nel formato ID della documentazione dei simboli, con un prefisso facoltativo T:.

Esempi:

Valore opzione Riepilogo
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Corrisponde a tutti i tipi denominati MyType e a tutti i relativi tipi derivati.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Corrisponde a tutti i tipi denominati MyType1 o MyType2 e a tutti i relativi tipi derivati.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Corrisponde a un tipo MyType specifico con il nome completo specificato e tutti i relativi tipi derivati.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Abbina tipi specifici MyType1 e MyType2 con i rispettivi nomi completamente qualificati e tutti i relativi tipi derivati.

Esempi di pseudo-codice

Violazione del vettore di byte codificato in modo fisso

using System;
using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] someOtherBytesForIV)
    {
        byte[] rgbKey = new byte[] {1, 2, 3};
        SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
        rijn.CreateEncryptor(rgbKey, someOtherBytesForIV);
    }
}

Violazione hard-coded di Convert.FromBase64String

using System;
using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] someOtherBytesForIV)
    {
        byte[] key = Convert.FromBase64String("AAAAAaazaoensuth");
        SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
        rijn.CreateEncryptor(key, someOtherBytesForIV);
    }
}

Violazione della codifica fissa di Encoding.GetBytes

using System.Text;
using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] someOtherBytesForIV)
    {
        byte[] key = Encoding.ASCII.GetBytes("AAAAAaazaoensuth");
        SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
        rijn.CreateEncryptor(key, someOtherBytesForIV);
    }
}

Soluzione

using System.Text;
using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(char[] chars, byte[] someOtherBytesForIV)
    {
        byte[] key = Encoding.ASCII.GetBytes(chars);
        SymmetricAlgorithm rijn = SymmetricAlgorithm.Create();
        rijn.CreateEncryptor(key, someOtherBytesForIV);
    }
}