Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
| 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ů:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Algoritmus, který pravidlo nemůže určit v době kompilace
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);
}
}