CA5379: Ujistěte se, že je algoritmus funkce odvození klíče dostatečně silný.

Vlastnost Hodnota
ID pravidla CA5379
Název Ujistěte se, že algoritmus funkce odvození klíče je dostatečně silný.
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

Při vytváření System.Security.Cryptography.Rfc2898DeriveBytesinstancí použijte jeden z následujících algoritmů:

Popis pravidla

Ve Rfc2898DeriveBytes výchozím nastavení se třída používá SHA1 algoritmus. Při vytváření instance objektu Rfc2898DeriveBytes byste měli zadat hashovací algoritmus SHA256 nebo vyšší. Všimněte si, že Rfc2898DeriveBytes.HashAlgorithm vlastnost má pouze přístupové objekty get .

Jak opravit porušení

Protože MD5 nebo SHA1 jsou ohroženy kolizemi, použijte SHA256 pro třídu nebo vyšší Rfc2898DeriveBytes .

Starší verze rozhraní .NET Framework nebo .NET Core nemusí umožňovat zadat hashovací algoritmus funkce odvození klíče. V takových případech je potřeba upgradovat cílovou verzi rozhraní .NET, aby používala silnější algoritmus.

Kdy potlačit upozornění

Nedoporučuje se potlačit toto pravidlo s výjimkou důvodů kompatibility aplikací.

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

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.CA5379.severity = none

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

Příklady pseudokódu

Určení algoritmu hash v porušení konstruktoru

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

Určení algoritmu hash v porušení konstruktoru odvozené třídy

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

Nastavení vlastnosti hash algoritmu v porušení odvozených tříd

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

Řešení

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