CA5379: убедитесь, что алгоритм функции формирования ключа достаточно надежен

Свойство Значение
Идентификатор правила CA5379
Заголовок Убедитесь, что алгоритм функции производных ключей достаточно строго
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 8 No

Причина

При создании экземпляра используется один из следующих алгоритмов System.Security.Cryptography.Rfc2898DeriveBytes:

Описание правила

Класс 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);
    }
}