从 .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() 标记为已过时)并生成带有 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,以跟上加密方面的进展。 例如,当 SHA-1 哈希算法是最先进的时, HashAlgorithm.Create() 该方法在 .NET Framework 1.0 中引入。 20 年过去了,现在 SHA-1 被认为是破碎的,但我们不能改变 HashAlgorithm.Create() 以返回不同的算法。 这样做会在使用的应用程序中引入不可接受的中断性变更。
最佳做法规定,使用加密基元(如 AES、SHA-* 和 RSA)的库应完全控制它们使用这些基元的方式。 需要将来证明的应用程序应使用更高级别的库来包装这些基元,并添加密钥管理和加密敏捷性功能。 这些库通常由托管环境提供。 一个示例是 ASP。NET 的数据保护库,它代表调用应用程序处理这些问题。
已引入的版本
5.0
建议的措施
建议的作方法是将对现已过时的 API 的调用替换为对特定算法的工厂方法的调用,例如 Aes.Create()。 这可让你完全控制实例化哪些算法。
如果需要保持与使用现已过时 API 的 .NET Framework 应用生成的现有有效负载的兼容性,请使用下表中建议的替换项。 该表提供从 .NET Framework 默认算法到其 .NET 5+ 等效项的映射。
.NET 框架 .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 。