Cifrado de claves en reposo en Windows y Azure mediante ASP.NET Core

El sistema de protección de datos emplea un mecanismo de detección de forma predeterminada para determinar cómo se deben cifrar las claves criptográficas en reposo. El desarrollador puede invalidar el mecanismo de detección y especificar manualmente cómo se deben cifrar las claves en reposo.

Advertencia

Si especifica una ubicación de persistencia de clave explícita, el sistema de protección de datos anula el registro del cifrado de claves predeterminado en reposo. Por lo tanto, las claves ya no se cifran en reposo. Se recomienda especificar un mecanismo de cifrado de clave explícito para las implementaciones de producción. Las opciones del mecanismo de cifrado en reposo se describen en este tema.

Azure Key Vault

Para almacenar claves en Azure Key Vault, configure el sistema con ProtectKeysWithAzureKeyVault en la clase Startup:

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

Para obtener más información, consulte Configurar la protección de datos de ASP.NET Core: ProtectKeysWithAzureKeyVault.

Windows DPAPI

Solo se aplica a las implementaciones de Windows.

Cuando se usa DPAPI de Windows, el material de clave se cifra con CryptProtectData antes de conservarse en el almacenamiento. DPAPI es un mecanismo de cifrado adecuado para los datos que nunca se leen fuera de la máquina actual (aunque es posible hacer una copia de seguridad de estas claves en Active Directory). Para configurar el cifrado de clave en reposo de DPAPI, llame a uno de los ProtectKeysWithDpapi) métodos de extensión:

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

Si ProtectKeysWithDpapi se llama a sin parámetros, solo la cuenta de usuario actual de Windows puede descifrar el anillo de claves persistente. Opcionalmente, puede especificar que cualquier cuenta de usuario de la máquina (no solo la cuenta de usuario actual) pueda descifrar el anillo de claves:

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

Certificado X.509

Si la aplicación se distribuye entre varias máquinas, puede ser conveniente distribuir un certificado X.509 compartido entre las máquinas y configurar las aplicaciones hospedadas para usar el certificado para el cifrado de claves en reposo:

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

Debido a las limitaciones de .NET Framework, solo se admiten certificados con claves privadas CAPI. Consulte el contenido siguiente para ver posibles soluciones alternativas a estas limitaciones.

Windows DPAPI-NG

Este mecanismo solo está disponible en Windows 8/Windows Server 2012 o posterior.

A partir de Windows 8, el sistema operativo Windows admite DPAPI-NG (también denominado DPAPI de CNG). Para más información, consulte Acerca de CNG DPAPI.

La entidad de seguridad se codifica como una regla de descriptor de protección. En el ejemplo siguiente que llama a ProtectKeysWithDpapiNG, solo el usuario unido a un dominio con el SID especificado puede descifrar el anillo de claves:

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

También hay una sobrecarga sin parámetros de ProtectKeysWithDpapiNG. Use este método de conveniencia para especificar la regla "SID={CURRENT_ACCOUNT_SID}", donde CURRENT_ACCOUNT_SID es el SID de la cuenta de usuario de Windows actual:

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

En este escenario, el controlador de dominio de AD es responsable de distribuir las claves de cifrado utilizadas por las operaciones de DPAPI-NG. El usuario de destino puede descifrar la carga cifrada de cualquier máquina unida a un dominio (siempre que el proceso se ejecute en su identidad).

Cifrado basado en certificados con Windows DPAPI-NG

Si la aplicación se ejecuta en Windows 8.1/Windows Server 2012 R2 o posterior, puede usar WINDOWS DPAPI-NG para realizar el cifrado basado en certificados. Use la cadena de descriptor de regla "CERTIFICATE=HashId:THUMBPRINT", donde THUMBPRINT es la huella digital SHA1 codificada en hexadecimal del certificado:

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

Cualquier aplicación que apunte a este repositorio debe ejecutarse en Windows 8.1/Windows Server 2012 R2 o posterior para descifrar las claves.

Cifrado de clave personalizado

Si los mecanismos de la bandeja de entrada no son apropiados, el desarrollador puede especificar su propio mecanismo de cifrado de claves proporcionando un IXmlEncryptor personalizado.