Share via


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:

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);
    }
}