CA5379: Sicherstellen eines ausreichend starken Algorithmus für die Schlüsselableitungsfunktion

Eigenschaft Wert
Regel-ID CA5379
Titel Sicherstellen eines ausreichend starken Algorithmus für die Schlüsselableitungsfunktion
Kategorie Security
Fix führt oder führt nicht zur Unterbrechung Nicht unterbrechend
Standardmäßig in .NET 8 aktiviert Nein

Ursache

Verwenden Sie für die Instanziierung von System.Security.Cryptography.Rfc2898DeriveBytes einen der folgenden Algorithmen:

Regelbeschreibung

Die Klasse Rfc2898DeriveBytes verwendet standardmäßig den Algorithmus SHA1. Wenn Sie ein Rfc2898DeriveBytes-Objekt instanziieren, sollten Sie mindestens den Hashalgorithmus SHA256 angeben. Beachten Sie hierbei, dass die Eigenschaft Rfc2898DeriveBytes.HashAlgorithm nur einen get-Accessor aufweist.

Behandeln von Verstößen

Da MD5 oder SHA1 anfällig für Kollisionen sind, sollten Sie SHA256 oder höher für die Klasse Rfc2898DeriveBytes verwenden.

Bei älteren Versionen des .NET Frameworks oder von .NET Core ist es gegebenenfalls nicht möglich, einen Hashalgorithmus für die Schlüsselableitungsfunktion anzugeben. In solchen Fällen müssen Sie die Zielframeworkversion von .NET aktualisieren, um einen stärkeren Algorithmus zu verwenden.

Wann sollten Warnungen unterdrückt werden?

Es wird nicht empfohlen, diese Regel zu unterdrücken, solange keine Gründe bezüglich der Anwendungskompatibilität vorliegen.

Unterdrücken einer Warnung

Um nur eine einzelne Verletzung zu unterdrücken, fügen Sie der Quelldatei Präprozessoranweisungen hinzu, um die Regel zu deaktivieren und dann wieder zu aktivieren.

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

Um die Regel für eine Datei, einen Ordner oder ein Projekt zu deaktivieren, legen Sie den Schweregrad in der Konfigurationsdatei auf none fest.

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

Weitere Informationen finden Sie unter Vorgehensweise: Unterdrücken von Codeanalyse-Warnungen.

Pseudocodebeispiele

Angeben eines Hashalgorithmus in einem Konstruktorverstoß

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

Angeben eines Hashalgorithmus in einem Konstruktorverstoß von „DerivedClass“

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

Festlegen einer Hashalgorithmuseigenschaft im Verstoß „DerivedClass“

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

Lösung

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