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:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Ein Algorithmus, den die Regel zur Kompilierzeit nicht bestimmen kann
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);
}
}