CA5379: Verificare che l'algoritmo della funzione di derivazione della chiave sia sufficientemente forte

Proprietà valore
ID regola CA5379
Titolo Verificare che l'algoritmo della funzione di derivazione della chiave sia sufficientemente forte
Categoria Sicurezza
Correzione che causa un'interruzione o un'interruzione Nessuna interruzione
Abilitato per impostazione predefinita in .NET 8 No

Causa

Uso di uno degli algoritmi seguenti durante la creazione di un'istanza System.Security.Cryptography.Rfc2898DeriveBytesdi :

Descrizione regola

Per impostazione predefinita, la Rfc2898DeriveBytes classe usa l'algoritmo SHA1 . Quando si crea un'istanza di un Rfc2898DeriveBytes oggetto, è necessario specificare un algoritmo hash di SHA256 o versione successiva. Si noti che Rfc2898DeriveBytes.HashAlgorithm la proprietà dispone solo di una get funzione di accesso.

Come correggere le violazioni

Poiché MD5 o SHA1 sono vulnerabili a collisioni, usare SHA256 o versione successiva per la Rfc2898DeriveBytes classe .

Le versioni precedenti di .NET Framework o .NET Core potrebbero non consentire di specificare un algoritmo hash della funzione di derivazione della chiave. In questi casi, è necessario aggiornare la versione del framework di destinazione di .NET per usare un algoritmo più avanzato.

Quando eliminare gli avvisi

Non è consigliabile eliminare questa regola ad eccezione dei motivi di compatibilità delle applicazioni.

Eliminare un avviso

Se si vuole eliminare una singola violazione, aggiungere direttive del preprocessore al file di origine per disabilitare e quindi riabilitare la regola.

#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379

Per disabilitare la regola per un file, una cartella o un progetto, impostarne la gravità none su nel file di configurazione.

[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none

Per altre informazioni, vedere Come eliminare gli avvisi di analisi del codice.

Esempi di pseudo-codice

Specificare l'algoritmo hash in violazione del costruttore

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

Specificare l'algoritmo hash nella violazione del costruttore della classe derivata

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
    }
}

Impostare la proprietà dell'algoritmo hash nelle violazioni delle classi derivate

using System.Security.Cryptography;

class DerivedClass : Rfc2898DeriveBytes
{
    public DerivedClass (byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm) : base(password, salt, iterations, hashAlgorithm)
    {
    }

    public HashAlgorithmName HashAlgorithm { get; set;}
}

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var derivedClass = new DerivedClass(password, salt, iterations, HashAlgorithmName.MD5);
        derivedClass.HashAlgorithm = HashAlgorithmName.SHA256;
    }
}

Soluzione

using System.Security.Cryptography;

class ExampleClass
{
    public void ExampleMethod(byte[] password, byte[] salt, int iterations, HashAlgorithmName hashAlgorithm)
    {
        var rfc2898DeriveBytes = new Rfc2898DeriveBytes(password, salt, iterations, HashAlgorithmName.SHA256);
    }
}