CA5373: Nepoužívejte zastaralou funkci odvození klíče

Vlastnost Hodnota
ID pravidla CA5373
Název Nepoužívat zastaralou funkci odvození klíče
Kategorie Zabezpečení
Oprava způsobující chybu nebo chybu způsobující chybu Nenarušující
Povoleno ve výchozím nastavení v .NET 8 No

Příčina

Kryptograficky slabé metody System.Security.Cryptography.PasswordDeriveBytes odvození klíče nebo Rfc2898DeriveBytes.CryptDeriveKey se používají ke generování klíče.

Popis pravidla

Toto pravidlo detekuje vyvolání slabých metod System.Security.Cryptography.PasswordDeriveBytes odvození klíče a Rfc2898DeriveBytes.CryptDeriveKey. System.Security.Cryptography.PasswordDeriveBytes použil slabý algoritmus PBKDF1. Rfc2898DeriveBytes.CryptDeriveKey nepoužívá počet iterací a sůl z objektu Rfc2898DeriveBytes , což z něj činí slabé.

Jak opravit porušení

Odvození klíče založeného na heslech by mělo používat algoritmus PBKDF2 s hashováním SHA-2. Rfc2898DeriveBytes.GetBytes toho lze dosáhnout.

Kdy potlačit upozornění

Potlačit upozornění, pokud je riziko spojené s používáním PBKDF1 pečlivě zkontrolováno a přijato.

Potlačení upozornění

Pokud chcete pouze potlačit jedno porušení, přidejte do zdrojového souboru direktivy preprocesoru, abyste pravidlo zakázali a znovu povolili.

#pragma warning disable CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

Pokud chcete pravidlo pro soubor, složku nebo projekt zakázat, nastavte jeho závažnost v none konfiguračním souboru.

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

Další informace naleznete v tématu Jak potlačit upozornění analýzy kódu.

Příklady pseudokódu

Porušení

V době psaní tohoto článku znázorňuje následující vzor pseudokódu model zjištěný tímto pravidlem.

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

Řešení

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