Udostępnij za pośrednictwem


CA5379: Upewnij się, że algorytm funkcji wyprowadzania klucza jest wystarczająco silny

Właściwości Wartość
Identyfikator reguły CA5379
Stanowisko 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 8 Nie.

Przyczyna

Użyj jednego z następujących algorytmów podczas tworzenia wystąpienia System.Security.Cryptography.Rfc2898DeriveBytes:

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