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 mecanismo de cifrado de claves en reposo predeterminado. Por lo tanto, las claves ya no se cifran en reposo. Se recomienda especificar un mecanismo de cifrado de claves 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 Startup clase :
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
.ProtectKeysWithAzureKeyVault("<keyIdentifier>", "<clientId>", "<clientSecret>");
}
Para obtener más información, vea Configurar ASP.NET Core Data Protection: 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 del equipo actual (aunque es posible realizar una copia de seguridad de estas claves en Active Directory; consulte la sección DPAPI y perfiles móviles de Solución de problemas de la API de protección de datos (DPAPI). Para configurar el cifrado de clave en reposo de DPAPI, llame a uno de los métodos de extensión ProtectKeysWithDpapi:
public void ConfigureServices(IServiceCollection services)
{
// Only the local user account can decrypt the keys
services.AddDataProtection()
.ProtectKeysWithDpapi();
}
Si se llama a sin parámetros, solo la cuenta de usuario actual ProtectKeysWithDpapi de Windows puede descifrar el anillo de clave persistente. Opcionalmente, puede especificar que cualquier cuenta de usuario del equipo (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 que usen el certificado para el cifrado de claves en reposo:
public void ConfigureServices(IServiceCollection services)
{
services.AddDataProtection()
.ProtectKeysWithCertificate("3BCE558E2AD3E0E34A7743EAB5AEA2A9BD2575A0");
}
Debido a .NET Framework limitaciones, 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 o Windows Server 2012 o posterior.
A partir Windows 8, el sistema operativo Windows admite DPAPI-NG (también denominado DPAPI de CNG). Para obtener más información, vea Acerca de DPAPI de CNG.
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 clave:
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 actual de Windows:
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 usadas por las operaciones DPAPI-NG. El usuario de destino puede descifrar la carga cifrada desde cualquier máquina unida a un dominio (siempre que el proceso se ejecute con su identidad).
Cifrado basado en certificados con DPAPI-NG de Windows
Si la aplicación se ejecuta en Windows 8.1/Windows Server 2012 R2 o posterior, puede usar DPAPI-NG de Windows para realizar el cifrado basado en certificados. Use la cadena de descriptor de reglas "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 apunta a este repositorio debe ejecutarse en Windows 8.1/Windows Server 2012 R2 o posterior para descifrar las claves.
Cifrado de claves personalizado
Si los mecanismos de entrada no son adecuados, el desarrollador puede especificar su propio mecanismo de cifrado de claves proporcionando un IXmlEncryptor personalizado.