密碼編譯抽象上的無參數 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 。