암호화 추상화의 매개 변수 없는 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의 데이터 보호 라이브러리로, 호출 애플리케이션을 대신하여 이러한 문제를 처리합니다.
도입된 버전
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
.NET