Partilhar via


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.

Advertência

Se você especificar um local explícito de persistência de chave , 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 sã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.

Azure Key Vault

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, consulte Configure ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault.

Windows DPAPI

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

Quando o DPAPI do Windows é utilizado, o material da chave é criptografado com CryptProtectData antes de ser armazenado. 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 para o Ative Directory). Para configurar a criptografia de chave em repouso 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 conjunto de chaves persistente. Opcionalmente, você pode especificar que qualquer conta de usuário na máquina (não apenas a conta de usuário atual) seja capaz de decifrar o porta-chaves:

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 espalhado por várias máquinas, pode ser conveniente distribuir um certificado X.509 compartilhado entre as máquinas 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 às limitações do .NET Framework, apenas certificados com chaves privadas CAPI são suportados. Consulte o conteúdo abaixo para obter possíveis soluções alternativas para essas limitações.

Windows DPAPI-NG

Este mecanismo está disponível apenas no Windows 8/Windows Server 2012 ou posterior.

A partir do Windows 8, o sistema operacional Windows suporta DPAPI-NG (também chamado de CNG DPAPI). Para obter mais informações, consulte Sobre o CNG DPAPI.

O principal é codificado como regra de um descritor de proteção. No exemplo a seguir que chama ProtectKeysWithDpapiNG, apenas o utilizador associado ao domínio com o SID especificado pode descriptografar o anel de chaves:

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

Há também uma sobrecarga sem parâmetros de ProtectKeysWithDpapiNG. Use este método de conveniência para especificar a regra "SID={CURRENT_ACCOUNT_SID}", onde 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 de DPAPI-NG. O usuário alvo pode decifrar a carga criptografada de qualquer máquina associada ao domínio (desde que o processo esteja sendo executado sob sua identidade).

Criptografia baseada em certificado com o Windows DPAPI-NG

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

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

Qualquer aplicativo apontado para este 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 da caixa de entrada não forem apropriados, o desenvolvedor poderá especificar seu próprio mecanismo de criptografia de chave fornecendo um IXmlEncryptorpersonalizado.