CA5379: Verificare che l'algoritmo della funzione di derivazione della chiave sia sufficientemente forte
Proprietà | valore |
---|---|
ID regola | CA5379 |
Title | Verificare che l'algoritmo della funzione di derivazione della chiave sia sufficientemente forte |
Categoria | Sicurezza |
La correzione causa un'interruzione o meno | Non causa un'interruzione |
Abilitato per impostazione predefinita in .NET 9 | No |
Causa
Uso di uno degli algoritmi seguenti durante la creazione di un'istanza System.Security.Cryptography.Rfc2898DeriveBytesdi :
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Algoritmo che la regola non può determinare in fase di compilazione
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);
}
}