다음을 통해 공유


ASP.NET Core를 사용하여 Windows 및 Azure의 저장 상태에서 키 암호화

데이터 보호 시스템 기본적으로 검색 메커니즘을 사용하여 암호화 키를 미사용 시 암호화하는 방법을 결정합니다. 개발자는 검색 메커니즘을 재정의하고 미사용 키를 암호화하는 방법을 수동으로 지정할 수 있습니다.

경고

명시적 키 지속성 위치을 지정한 경우 데이터 보호 시스템은 기본 키 유휴 상태 암호화 메커니즘을 등록 취소합니다. 따라서 키는 더 이상 미사용 시 암호화되지 않습니다. 프로덕션 배포에 대한 명시적 키 암호화 메커니즘을 지정하는 것이 좋습니다. 미사용 암호화 메커니즘 옵션은 이 항목에서 설명합니다.

Azure Key Vault (애저 키 볼트)

자세한 내용은 ASP.NET Core 데이터 보호 구성을 참조하세요.

Windows DPAPI

Windows 배포에만 적용됩니다.

Windows DPAPI를 사용하는 경우 키 자료는 스토리지에 유지되기 전에 CryptProtectData를 사용하여 암호화됩니다. DPAPI는 현재 컴퓨터 외부에서 읽지 않는 데이터에 적합한 암호화 메커니즘입니다(이러한 키를 Active Directory로 백업할 수는 있지만). DPAPI 미사용 키 암호화를 구성하려면 ProtectKeysWithDpapi) 확장 메서드 중 하나를 호출합니다.

// Only the local user account can decrypt the keys
services.AddDataProtection()
    .ProtectKeysWithDpapi();

매개 변수 없이 ProtectKeysWithDpapi를 호출하면 현재 Windows 사용자 계정만 지속형 키 링을 해독할 수 있습니다. 필요에 따라 현재 사용자 계정뿐만 아니라 머신의 모든 사용자 계정이 키 링을 해독할 수 있도록 지정할 수 있습니다.

// All user accounts on the machine can decrypt the keys
services.AddDataProtection()
    .ProtectKeysWithDpapi(protectToLocalMachine: true);

X.509 인증서

앱이 여러 컴퓨터에 분산되어 있는 경우 컴퓨터 간에 공유 X.509 인증서(.pfx 형식)를 배포하고 미사용 키 암호화에 인증서를 사용하도록 호스트된 앱을 구성하는 것이 편리할 수 있습니다.

다음 예제에서는 인증서의 지문이 다음으로 ProtectKeysWithCertificate전달됩니다.

services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");

다음 예제에서는 X509Certificate2이(가) ProtectKeysWithCertificate에 전달됩니다.

var cert = new X509Certificate2(...);

services.AddDataProtection()
    .ProtectKeysWithCertificate(cert);

인증서를 만들려면 다음 접근 방식 중 하나를 사용하거나 다른 적합한 도구나 온라인 서비스를 사용합니다.

자세한 내용은 .NET CLI를 사용하여 자체 서명된 인증서 생성을 참조하세요.

.NET Framework 제한으로 인해 CAPI 프라이빗 키가 있는 인증서만 지원됩니다. 이러한 제한 사항에 대한 가능한 해결 방법은 아래 콘텐츠를 참조하세요.

Windows DPAPI-NG

이 메커니즘은 Windows 8/Windows Server 2012 이상에서만 사용할 수 있습니다.

Windows 8부터 Windows OS는 DPAPI-NG(CNG DPAPI라고도 함)를 지원합니다. 자세한 내용은 CNG DPAPI 정보를 참조하세요.

보안 주체는 보호 설명자 규칙으로 인코딩됩니다. 다음 예제에서는 ProtectKeysWithDpapiNG지정된 SID를 가진 도메인에 가입된 사용자만 키 링의 암호를 해독할 수 있습니다.

public void ConfigureServices(IServiceCollection services)
{
    // Uses the descriptor rule "SID=S-1-5-21-..."
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("SID=S-1-5-21-...",
        flags: DpapiNGProtectionDescriptorFlags.None);
}

매개 변수가 없는 ProtectKeysWithDpapiNG 오버로드도 있습니다. 이 편리한 방법을 사용하여 "SID={CURRENT_ACCOUNT_SID}" 규칙을 지정합니다. 여기서 CURRENT_ACCOUNT_SID는 현재 Windows 사용자 계정의 SID입니다.

public void ConfigureServices(IServiceCollection services)
{
    // Use the descriptor rule "SID={current account SID}"
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG();
}

이 시나리오에서 AD 도메인 컨트롤러는 DPAPI-NG 작업에서 사용하는 암호화 키를 배포합니다. 대상 사용자는 도메인에 가입된 컴퓨터에서 암호화된 페이로드를 해독할 수 있습니다(프로세스가 해당 ID로 실행되는 경우).

Windows DPAPI-NG를 사용하는 인증서 기반 암호화

앱이 Windows 8.1/Windows Server 2012 R2 이상에서 실행되는 경우 Windows DPAPI-NG를 사용하여 인증서 기반 암호화를 수행할 수 있습니다. 규칙 설명자 문자열 "CERTIFICATE=HashId:{CERTIFICATE THUMBPRINT}", 여기서 {CERTIFICATE THUMBPRINT} 자리 표시자는 인증서의 16진수로 인코딩된 SHA1 지문입니다, 는 사용됩니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithDpapiNG("CERTIFICATE=HashId:{CERTIFICATE THUMBPRINT}",
            flags: DpapiNGProtectionDescriptorFlags.None);
}

키를 해독하려면 이 리포지토리를 가리키는 앱이 Windows 8.1/Windows Server 2012 R2 이상에서 실행되고 있어야 합니다.

사용자 지정 키 암호화

기본 제공 메커니즘이 적절하지 않은 경우 개발자는 사용자 지정 IXmlEncryptor을 제공하여 자체 키 암호화 메커니즘을 지정할 수 있습니다.