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


Создание экземпляров реализаций по умолчанию для криптографических абстракций не поддерживается

Начиная с версии .NET 5.0 перегрузки Create() без параметров для криптографических абстракций не рекомендуются к применению и приводят к возникновению предупреждения.

Описание изменения

В .NET Framework версий с 2.0 по 4.8 фабрики абстрактных примитивов шифрования, такие как HashAlgorithm.Create(), могут быть настроены для возврата различных алгоритмов. Например, при установке .NET Framework 4.8 по умолчанию статический метод без параметров HashAlgorithm.Create() возвращает экземпляр алгоритма SHA1, как показано в следующем фрагменте кода.

только платформа .NET Framework

// Return an instance of the default hash algorithm (SHA1).
HashAlgorithm alg = HashAlgorithm.Create();
// Prints 'System.Security.Cryptography.SHA1CryptoServiceProvider'.
Console.WriteLine(alg.GetType());

// Change the default algorithm to be SHA256, not SHA1.
CryptoConfig.AddAlgorithm(typeof(SHA256CryptoServiceProvider), typeof(HashAlgorithm).FullName);
alg = HashAlgorithm.Create();
// Prints 'System.Security.Cryptography.SHA256CryptoServiceProvider'.
Console.WriteLine(alg.GetType());

Также можно использовать конфигурации на уровне компьютера для изменения алгоритма по умолчанию без необходимости программного вызова CryptoConfig.

В .NET Core версий с 2.0 по 3.1 фабрики абстрактных примитивов шифрования, такие как HashAlgorithm.Create(), всегда создают исключение PlatformNotSupportedException.

// Throws PlatformNotSupportedException on .NET Core.
HashAlgorithm alg = HashAlgorithm.Create();

В .NET 5 и более поздних версий фабрики абстрактных примитивов шифрования, такие как HashAlgorithm.Create(), не рекомендуются для использования и во время компиляции с создают предупреждение идентификатором SYSLIB0007. Во время выполнения эти методы продолжают создавать исключение PlatformNotSupportedException.

// Throws PlatformNotSupportedException.
// Also produces compile-time warning SYSLIB0007 on .NET 5+.
HashAlgorithm alg = HashAlgorithm.Create();

Это изменение происходит только во время компиляции. Относительно предыдущих версий .NET Core во время выполнения нет никаких изменений.

Примечание.

  • Для применения не рекомендуются только перегрузки методов Create() без параметров. Параметризованные перегрузки по-прежнему актуальны и функционируют в соответствии с ожиданиями.

    // Call Create(string), providing an explicit algorithm family name.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    HashAlgorithm hashAlg = HashAlgorithm.Create("SHA256");
    
  • Перегрузки без параметров для определенных семейств алгоритмов (не абстракции) также сохраняют актуальность и будут продолжать работать ожидаемым образом.

    // Call a specific algorithm family's parameterless Create() ctor.
    // Works in .NET Framework, .NET Core, and .NET 5+.
    Aes aesAlg = Aes.Create();
    

Причина изменения

Система конфигурации шифрования, представленная в .NET Framework, больше не используется в .NET Core и .NET 5 и более поздних версий, поскольку она является устаревшей и не позволяет обеспечить необходимую гибкость шифрования. Требования к обратной совместимости .NET также не позволяют платформе обновлять определенные API шифрования, чтобы обеспечить поддержку улучшений технологий шифрования. Например, метод HashAlgorithm.Create() был представлен в .NET Framework 1.0, когда алгоритм хэширования SHA-1 соответствовал уровню развития технологий на тот момент. Прошло двадцать лет, и теперь SHA-1 считается ненадежным, но мы не можем изменить HashAlgorithm.Create() для возврата другого алгоритма. Это может привести к неприемлемым критическим изменениям в использовании приложений.

Рекомендации предписывают, что библиотеки, использующие примитивы шифрования (такие как AES, SHA-* и RSA), должны полностью контролировать использование этих примитивов. Приложения, для которых требуется обеспечить гарантированную актуальность в будущем, должны использовать библиотеки более высокого уровня, которые заключают эти примитивы в оболочку, а затем добавляют возможности управления ключами и гибкого шифрования. Такие библиотеки часто предоставляются средой размещения. В качестве примера можно привести библиотеку защиты данных ASP.NET, которая обеспечивает решение этих задач от имени вызывающего приложения.

Представленные версии

5,0

  • Рекомендуется заменить вызовы к устаревшим API вызовами методов фабрики для конкретных алгоритмов, например Aes.Create(). Таким образом, вы будете полностью контролировать алгоритмы, для которых создаются экземпляры.

  • Если необходимо обеспечить совместимость с существующими полезными данными, создаваемыми приложениями .NET Framework, которые используют устаревшие API, используйте предложенные в следующей таблице альтернативные варианты. В этой таблице приводится сопоставление алгоритмов .NET Framework по умолчанию с их эквивалентами в .NET 5 и более поздних версий.

    .NET Framework Совместимый эквивалент в .NET Core или .NET 5 и более поздних версий Замечания
    AsymmetricAlgorithm.Create() RSA.Create()
    HashAlgorithm.Create() SHA1.Create() Алгоритм SHA-1 считается ненадежным. По возможности рекомендуется использовать более надежный алгоритм. Дополнительные сведения вы можете получить у своего консультанта по вопросам безопасности.
    HMAC.Create() HMACSHA1() Алгоритм HMACSHA1 не рекомендуется к применению для большинства современных приложений. По возможности рекомендуется использовать более надежный алгоритм. Дополнительные сведения вы можете получить у своего консультанта по вопросам безопасности.
    KeyedHashAlgorithm.Create() HMACSHA1() Алгоритм HMACSHA1 не рекомендуется к применению для большинства современных приложений. По возможности рекомендуется использовать более надежный алгоритм. Дополнительные сведения вы можете получить у своего консультанта по вопросам безопасности.
    SymmetricAlgorithm.Create() Aes.Create()
  • Если вам по-прежнему требуется вызывать устаревшие перегрузки Create() без параметров, вы можете отключить предупреждение SYSLIB0007 в коде.

    #pragma warning disable SYSLIB0007 // Disable the warning.
    HashAlgorithm alg = HashAlgorithm.Create(); // Still throws PNSE.
    #pragma warning restore SYSLIB0007 // Re-enable the warning.
    

    Это предупреждение также можно отключить в файле проекта. В таком случае предупреждение также будет отключено для всех исходных файлов в проекте.

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
       <TargetFramework>net5.0</TargetFramework>
       <!-- NoWarn below suppresses SYSLIB0007 project-wide -->
       <NoWarn>$(NoWarn);SYSLIB0007</NoWarn>
      </PropertyGroup>
    </Project>
    

    Примечание.

    Если отключить SYSLIB0007, для указанных здесь API шифрования будут отключены только предупреждения об устаревании. Другие предупреждения не отключаются. Кроме того, даже если отключить предупреждение, эти устаревшие API все равно будут создавать исключение PlatformNotSupportedException во время выполнения.

Затронутые API