共用方式為


不支援具現化密碼編譯抽象概念的默認實作

密碼編譯抽象上的無參數 Create() 重載自 .NET 5.0 起作為警告而被視為過時。

變更描述

在 .NET Framework 2.0 - 4.8 中,可以設定抽象密碼原始工廠以傳回不同的演算法。 例如,在 .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,以跟上密碼編譯的進步。 例如,在 .NET Framework 1.0 中引進了 HashAlgorithm.Create() 方法,當時 SHA-1 哈希演算法是屬於最先進的。 20 年過去了,現在 SHA-1 被認為是破碎的,但我們無法變更 HashAlgorithm.Create() 以傳回不同的演算法。 這樣做會引入使用者應用程式無法接受的破壞性變更。

最佳做法規定取用密碼編譯基本類型的連結庫(例如 AES、SHA-*和 RSA)應該完全掌控它們取用這些基本類型的方式。 需要未來校訂的應用程式應利用高階連結庫來包裝這些基本類型,並新增密鑰管理和密碼編譯靈活度功能。 這些程式庫通常由主機環境提供。 其中一個範例是 ASP。NET 的數據保護連結庫,代表呼叫端應用程式處理這些考慮。

推出的版本

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