次の方法で共有


暗号化抽象化の既定の実装のインスタンス化はサポートされていません

暗号化抽象化に対するパラメーターなしの Create() オーバーロードは、.NET 5.0 の警告として廃止されています。

変更の説明

.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() などの抽象暗号化プリミティブ ファクトリは古い形式としてマークされ、ID 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() メソッドは、SHA-1 ハッシュ アルゴリズムが最先端であった .NET Framework 1.0 で導入されました。 20 年が経過し、SHA-1 は壊れていると見なされますが、 HashAlgorithm.Create() を変更して別のアルゴリズムを返すことはできません。 許容できない破壊的変更が消費者アプリケーションに導入されることになります。

ベスト プラクティスでは、暗号化プリミティブ (AES、SHA*、RSA など) を使用するライブラリは、これらのプリミティブの使用方法を完全に制御する必要があります。 将来の対応を必要とするアプリケーションでは、これらのプリミティブをラップし、キー管理と暗号化の機敏性の機能を追加する上位レベルのライブラリを利用する必要があります。 これらのライブラリは、多くの場合、ホスティング環境によって提供されます。 たとえば、ASP.NET の Data Protection ライブラリがあります。このライブラリは、呼び出し元のアプリケーションに代わってデータ保護の問題を処理します。

導入されたバージョン

5.0

  • 推奨される一連のアクションは、現在使用されなくなった API の呼び出しを、 Aes.Create()などの特定のアルゴリズムのファクトリ メソッドの呼び出しに置き換えます。 これにより、インスタンス化されるアルゴリズムを完全に制御できます。

  • 現在使用されていない API を使用する .NET Framework アプリによって生成された既存のペイロードとの互換性を維持する必要がある場合は、次の表に示す置換を使用します。 この表では、.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