다음을 통해 공유


암호화 추상화의 기본 구현 인스턴스화는 지원되지 않습니다.

암호화 추상화의 매개 변수 없는 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