CA5373: Nie używaj przestarzałej funkcji wyprowadzania kluczy
Właściwości | Wartość |
---|---|
Identyfikator reguły | CA5373 |
Tytuł | 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 9 | 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);
}
}