Criptografia de chave em repouso no Windows e no Azure usando o ASP.NET Core

O sistema de proteção de dados emprega um mecanismo de descoberta por padrão para determinar como as chaves criptográficas devem ser criptografadas em repouso. O desenvolvedor pode substituir o mecanismo de descoberta e especificar manualmente como as chaves devem ser criptografadas em repouso.

Aviso

Se você especificar um local de persistência de chave explícito, o sistema de proteção de dados cancelará o registro do mecanismo padrão de criptografia de chave em repouso. Consequentemente, as chaves não serão mais criptografadas em repouso. Recomendamos que você especifique um mecanismo de criptografia de chave explícito para implantações de produção. As opções do mecanismo de criptografia em repouso são descritas neste tópico.

Cofre de Chave do Azure

Para armazenar chaves no Azure Key Vault, configure o sistema com ProtectKeysWithAzureKeyVault na classe Startup:

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

Para obter mais informações, confira Configurar a Proteção de Dados do ASP.NET Core: ProtectKeysWithAzureKeyVault.

DPAPI do Windows

Aplica-se somente a implantações do Windows.

Quando o DPAPI do Windows é usado, o material da chave é criptografado com CryptProtectData antes de ser mantido no armazenamento. O DPAPI é um mecanismo de criptografia apropriado para dados que nunca são lidos fora da máquina atual (embora seja possível fazer backup dessas chaves no Active Directory). Para configurar a criptografia de chave em repouso do DPAPI, chame um dos ProtectKeysWithDpapi) métodos de extensão:

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

Se ProtectKeysWithDpapi for chamado sem parâmetros, somente a conta de usuário atual do Windows poderá decifrar o anel de chave persistente. Opcionalmente, você pode especificar que qualquer conta de usuário no computador (não apenas a conta do usuário atual) seja capaz de decifrar o anel de chave:

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

Certificado X.509

Se o aplicativo estiver distribuído em vários computadores, talvez seja conveniente distribuir um certificado X.509 compartilhado entre os computadores e configurar os aplicativos hospedados para usar o certificado para criptografia de chaves em repouso:

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

Devido a limitações do .NET Framework, há suporte apenas para certificados com chaves privadas CAPI. Confira o conteúdo abaixo para obter possíveis soluções alternativas para essas limitações.

DPAPI-NG do Windows

Esse mecanismo só está disponível no Windows 8/Windows Server 2012 ou posterior.

Começando com Windows 8, o sistema operacional Windows dá suporte ao DPAPI-NG (também chamado de DPAPI do CNG). Para obter mais informações, confira Sobre o DPAPI do CNG.

A entidade de segurança é codificada como uma regra do descritor de proteção. No exemplo a seguir que chama ProtectKeysWithDpapiNG, somente o usuário ingressado no domínio com o SID especificado pode descriptografar o anel de chave:

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);
}

Também há uma sobrecarga sem parâmetros de ProtectKeysWithDpapiNG. Use esse método de conveniência para especificar a regra "SID={CURRENT_ACCOUNT_SID}", em que CURRENT_ACCOUNT_SID é o SID da conta de usuário atual do Windows:

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

Nesse cenário, o controlador de domínio do AD é responsável por distribuir as chaves de criptografia usadas pelas operações do DPAPI-NG. O usuário de destino pode decifrar o conteúdo criptografado de qualquer computador ingressado no domínio (desde que o processo esteja em execução sob sua identidade).

Criptografia baseada em certificado com o DPAPI-NG do Windows

Se o aplicativo estiver em execução no Windows 8.1/Windows Server 2012 R2 ou posterior, você poderá usar o DPAPI-NG do Windows para executar a criptografia baseada em certificado. Use a cadeia de caracteres do descritor de regra "CERTIFICATE=HashId:THUMBPRINT", em que THUMBPRINT é a impressão digital SHA1 codificada por hexadecimal do certificado:

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

Qualquer aplicativo apontado para esse repositório deve estar em execução no Windows 8.1/Windows Server 2012 R2 ou posterior para decifrar as chaves.

Criptografia de chave personalizada

Se os mecanismos nativos não forem apropriados, o desenvolvedor poderá especificar seu próprio mecanismo de criptografia de chave fornecendo um IXmlEncryptor personalizado.