ASP.NET Core를 사용하여 Windows 및 Azure에서 미사용 키 암호화

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

Warning

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

Azure Key Vault

Azure Key Vault키를 저장하려면 클래스에서 Startup 시스템을 ProtectKeysWithAzureKeyVault 구성합니다.

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
        .ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}

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

Windows DPAPI

Windows 배포에만 적용됩니다.

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

public void ConfigureServices(IServiceCollection services)
{
    // Only the local user account can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi();
}

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

public void ConfigureServices(IServiceCollection services)
{
    // All user accounts on the machine can decrypt the keys
    services.AddDataProtection()
        .ProtectKeysWithDpapi(protectToLocalMachine: true);
}

X.509 인증서

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

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");
}

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

Windows DPAPI-NG

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

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

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

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:THUMBPRINT"를 사용합니다. 여기서 THUMBPRINT는 인증서의 16진수로 인코딩된 SHA1 지문입니다.

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

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

사용자 지정 키 암호화

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