CA5379: Ensure key derivation function algorithm is voldoende sterk
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA5379 |
Titel | Zorg ervoor dat het algoritme van de sleutel-afleidingsfunctie voldoende sterk is |
Categorie | Beveiliging |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Gebruik van een van de volgende algoritmen bij het instantiëren System.Security.Cryptography.Rfc2898DeriveBytes:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Een algoritme dat de regel niet kan bepalen tijdens het compileren
Beschrijving van regel
De Rfc2898DeriveBytes klasse maakt standaard gebruik van het SHA1 algoritme. Bij het instantiëren van een Rfc2898DeriveBytes object moet u een hash-algoritme van SHA256 of hoger opgeven. Houd er rekening mee dat Rfc2898DeriveBytes.HashAlgorithm de eigenschap alleen een get
accessor heeft.
Schendingen oplossen
Omdat MD5 of SHA1 kwetsbaar is voor botsingen, gebruikt SHA256 of hoger voor de Rfc2898DeriveBytes klasse.
Oudere versies van .NET Framework of .NET Core staan mogelijk niet toe dat u een hash-algoritme voor sleuteldeivatiefunctie opgeeft. In dergelijke gevallen moet u de doelframeworkversie van .NET upgraden om een sterker algoritme te gebruiken.
Wanneer waarschuwingen onderdrukken
Het wordt afgeraden deze regel te onderdrukken, met uitzondering van toepassingscompatibiliteitsredenen.
Een waarschuwing onderdrukken
Als u slechts één schending wilt onderdrukken, voegt u preprocessorrichtlijnen toe aan uw bronbestand om de regel uit te schakelen en vervolgens opnieuw in te schakelen.
#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Als u de regel voor een bestand, map of project wilt uitschakelen, stelt u de ernst none
ervan in op het configuratiebestand.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Zie Codeanalysewaarschuwingen onderdrukken voor meer informatie.
Voorbeelden van pseudocode
Hash-algoritme opgeven bij schending van constructor
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);
}
}
Hash-algoritme opgeven in de constructorschending van afgeleide klasse
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);
}
}
Eigenschap hash-algoritme instellen in schending van afgeleide klassen
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;
}
}
Oplossing
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);
}
}