Поделиться через


CA5373: не используйте устаревшую функцию вывода ключей

Свойство Значение
Идентификатор правила CA5373
Заголовок Не использовать устаревшую функцию формирования ключа
Категория Безопасность
Исправление является критическим или не критическим Не критическое
Включен по умолчанию в .NET 9 No

Причина

Для создания ключа используются криптографически слабые методы формирования ключей System.Security.Cryptography.PasswordDeriveBytes и (или) Rfc2898DeriveBytes.CryptDeriveKey.

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

Это правило обнаруживает вызов методов наследования слабых ключей System.Security.Cryptography.PasswordDeriveBytes и Rfc2898DeriveBytes.CryptDeriveKey. Метод System.Security.Cryptography.PasswordDeriveBytes использовал слабый алгоритм PBKDF1. Rfc2898DeriveBytes.CryptDeriveKey не использует число итераций и соль из объекта Rfc2898DeriveBytes, что делает его слабым.

Устранение нарушений

При формировании ключа на основе пароля следует использовать алгоритм PBKDF2 с хэшированием SHA-2. Для этого можно использовать Rfc2898DeriveBytes.GetBytes.

Когда лучше отключить предупреждения

Отключайте предупреждение из этого правила только после тщательной проверки риска, связанного с использованием PBKDF1, и принятия этого риска.

Отключение предупреждений

Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.

#pragma warning disable CA5373
// The code that's violating the rule is on this line.
#pragma warning restore CA5373

Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.

[*.{cs,vb}]
dotnet_diagnostic.CA5373.severity = none

Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.

Примеры псевдокода

Нарушение

На момент написания этой статьи следующий пример псевдокода иллюстрирует шаблон, обнаруживаемый этим правилом.

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes, string algname, string alghashname, int keySize, byte[] rgbIV)
    {
        rfc2898DeriveBytes.CryptDeriveKey(algname, alghashname, keySize, rgbIV);
    }
}

Решение

using System;
using System.Security.Cryptography;
class TestClass
{
    public void TestMethod(Rfc2898DeriveBytes rfc2898DeriveBytes)
    {
        rfc2898DeriveBytes.GetBytes(1);
    }
}