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, která může být destruktivní nebo nedestruktivní Nezlomitelný
Povoleno ve výchozím nastavení v .NET 10 Ne
Příslušné jazyky C# a Visual Basic

Příčina

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

Popis pravidla

Rfc2898DeriveBytes třída ve výchozím nastavení 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á jen přístupový objekt get.

Jak opravit porušení

Protože MD5 nebo SHA1 jsou ohroženy kolizemi, použijte SHA256 nebo vyšší pro třídu 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

Specifikace algoritmu hash při porušení v 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čete algoritmus hash v konstruktoru odvozené třídy jako porušení pravidla.

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

Nesprávné nastavení vlastnosti hash algoritmu v odvozených třídách

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