CA5373: Nie używaj przestarzałej funkcji wyprowadzania kluczy

Właściwości Wartość
Identyfikator reguły CA5373
Stanowisko Nie używaj przestarzałej funkcji wyprowadzania klucza
Kategoria Bezpieczeństwo
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Nie.

Przyczyna

Kryptograficznie słabe metody System.Security.Cryptography.PasswordDeriveBytes wyprowadzania kluczy i/lub Rfc2898DeriveBytes.CryptDeriveKey są używane do generowania klucza.

Opis reguły

Ta reguła wykrywa wywołanie metod wyprowadzania System.Security.Cryptography.PasswordDeriveBytes słabych kluczy i Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes użyto słabego algorytmu PBKDF1. Rfc2898DeriveBytes.CryptDeriveKey nie używa liczby iteracji i soli z Rfc2898DeriveBytes obiektu, co sprawia, że jest słaby.

Jak naprawić naruszenia

Wyprowadzanie klucza opartego na hasłach powinno używać algorytmu PBKDF2 z użyciem skrótu SHA-2. Rfc2898DeriveBytes.GetBytes może służyć do osiągnięcia tego celu.

Kiedy pomijać ostrzeżenia

Pomiń ostrzeżenie, jeśli ryzyko związane z użyciem pbKDF1 jest dokładnie sprawdzane i akceptowane.

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 CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

Aby wyłączyć regułę dla pliku, folderu lub projektu, ustaw jego ważność na none w pliku konfiguracji.

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

Aby uzyskać więcej informacji, zobacz Jak pominąć ostrzeżenia dotyczące analizy kodu.

Przykłady przykładów kodu przykładowego

Naruszenie

W momencie pisania tego tekstu poniższy przykład pseudo-kodu ilustruje wzorzec wykryty przez tę regułę.

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes, string algname, string alghashname, int keySize, byte[] rgbIV)
    {
        rfc2898DeriveBytes.CryptDeriveKey(algname, alghashname, keySize, rgbIV);
    }
}

Rozwiązanie

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes)
    {
        rfc2898DeriveBytes.GetBytes(1);
    }
}