CA5379: Upewnij się, że algorytm funkcji wyprowadzania klucza jest wystarczająco silny
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA5379 |
Tytuł | Upewnij się, że algorytm funkcji wyprowadzania kluczy jest wystarczająco silny |
Kategoria | Bezpieczeństwo |
Poprawka powodująca niezgodność lub niezgodność | Niezgodność |
Domyślnie włączone na platformie .NET 9 | Nie. |
Przyczyna
Użyj jednego z następujących algorytmów podczas tworzenia wystąpienia System.Security.Cryptography.Rfc2898DeriveBytes:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Algorytm, którego reguła nie może określić w czasie kompilacji
Opis reguły
Klasa Rfc2898DeriveBytes domyślnie używa algorytmu SHA1 . Podczas tworzenia Rfc2898DeriveBytes wystąpienia obiektu należy określić algorytm wyznaczania wartości skrótu lub nowszej SHA256 . Należy pamiętać, że Rfc2898DeriveBytes.HashAlgorithm właściwość ma tylko metodę get
dostępu.
Jak naprawić naruszenia
Ponieważ MD5 lub SHA1 są narażone na kolizje, należy użyć SHA256 lub wyższej klasy Rfc2898DeriveBytes .
Starsze wersje programu .NET Framework lub .NET Core mogą nie zezwalać na określanie algorytmu skrótu funkcji wyprowadzania klucza. W takich przypadkach należy uaktualnić docelową wersję platformy .NET, aby użyć silniejszego algorytmu.
Kiedy pomijać ostrzeżenia
Nie zaleca się pomijania tej reguły z wyjątkiem powodów zgodności aplikacji.
Pomijanie ostrzeżenia
Jeśli chcesz po prostu pominąć pojedyncze naruszenie, dodaj dyrektywy preprocesora do pliku źródłowego, aby wyłączyć, a następnie ponownie włączyć regułę.
#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none
w pliku konfiguracji.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.
Przykłady przykładów kodu przykładowego
Określanie algorytmu skrótu w naruszeniu konstruktora
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);
}
}
Określanie algorytmu skrótu w naruszeniu konstruktora klasy pochodnej
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);
}
}
Ustawianie właściwości algorytmu wyznaczania wartości skrótu w naruszeniach klas pochodnych
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;
}
}
Rozwiązanie
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);
}
}