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 9 | No |
Příčina
Při vytváření System.Security.Cryptography.Rfc2898DeriveBytesinstancí 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
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);
}
}