Compartilhar via


Criptografia de chave em rest 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 rest. O desenvolvedor pode substituir o mecanismo de descoberta e especificar manualmente como as chaves devem ser criptografadas em rest.

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 rest. Consequentemente, as chaves não serão mais criptografadas em rest. 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 rest 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 rest do DPAPI, chame um dos métodos de extensão ProtectKeysWithDpapi:

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 rest:

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 conectado ao domínio (desde que o processo esteja em execução sob sua identity).

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.