CA5379: убедитесь, что алгоритм функции формирования ключа достаточно надежен
Свойство | Значение |
---|---|
Идентификатор правила | CA5379 |
Заголовок | Убедитесь, что алгоритм функции производных ключей достаточно строго |
Категория | Безопасность |
Исправление является критическим или не критическим | Не критическое |
Включен по умолчанию в .NET 9 | No |
Причина
При создании экземпляра используется один из следующих алгоритмов System.Security.Cryptography.Rfc2898DeriveBytes:
- System.Security.Cryptography.MD5
- System.Security.Cryptography.SHA1
- Алгоритм, который правило не может определить во время компиляции
Описание правила
Класс Rfc2898DeriveBytes по умолчанию использует алгоритм SHA1. При создании экземпляра объекта Rfc2898DeriveBytes необходимо указать хэш-алгоритм SHA256 или выше. Обратите внимание, что свойство Rfc2898DeriveBytes.HashAlgorithm имеет только метод доступа get
.
Устранение нарушений
Поскольку MD5 или SHA1 подвержены конфликтам, используйте SHA256 или выше для класса Rfc2898DeriveBytes.
Более старые версии .NET Framework или .NET Core могут не позволять указывать хэш-алгоритм функции формирования ключа. В таких случаях необходимо обновить требуемую версию .NET, чтобы использовать более надежный алгоритм.
Когда лучше отключить предупреждения
Не рекомендуется отключать это правило, если только речь не идет о совместимости приложений.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA5379
// The code that's violating the rule is on this line.
#pragma warning restore CA5379
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none
в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA5379.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.
Примеры псевдокода
Нарушение, связанное с указанием хэш-алгоритма в конструкторе
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);
}
}
Нарушение, связанное с указанием хэш-алгоритма в конструкторе производного класса
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);
}
}
Нарушение, связанное с указанием свойства хэш-алгоритма в производных классах
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;
}
}
Решение
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);
}
}