Crittografia delle chiavi inattivi in Windows e Azure con ASP.NET Core

Per impostazione predefinita, il sistema di protezione dei dati usa un meccanismo di individuazione per determinare in che modo le chiavi crittografiche devono essere crittografate inattive. Lo sviluppatore può eseguire l'override del meccanismo di individuazione e specificare manualmente come crittografare le chiavi inattive.

Avviso

Se si specifica un percorso di persistenza della chiave esplicito, il sistema di protezione dei dati annulla la registrazione del meccanismo di crittografia della chiave predefinita inattivi. Di conseguenza, le chiavi non vengono più crittografate inattive. È consigliabile specificare un meccanismo di crittografia della chiave esplicito per le distribuzioni di produzione. Le opzioni relative al meccanismo di crittografia inattivi sono descritte in questo argomento.

Insieme di credenziali chiave di Azure

Per archiviare le chiavi in Azure Key Vault, configurare il sistema con ProtectKeysWithAzureKeyVault nella Startup classe :

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

Per altre informazioni, vedere Configurare ASP.NET Protezione dati di base: ProtectKeysWithAzureKeyVault.

Windows DPAPI

Si applica solo alle distribuzioni di Windows.

Quando si usa Windows DPAPI, il materiale della chiave viene crittografato con CryptProtectData prima di essere salvato in modo permanente nell'archiviazione. DPAPI è un meccanismo di crittografia appropriato per i dati che non vengono mai letti all'esterno del computer corrente (anche se è possibile eseguire il backup di queste chiavi fino ad Active Directory). Per configurare la crittografia con chiave inattiva DPAPI, chiamare uno dei metodi di ProtectKeysWithDpapiestensione ) :

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

Se ProtectKeysWithDpapi viene chiamato senza parametri, solo l'account utente di Windows corrente può decifrare l'anello di chiave persistente. Facoltativamente, è possibile specificare che qualsiasi account utente nel computer (non solo l'account utente corrente) sia in grado di decifrare l'anello della chiave:

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

Certificato X.509

Se l'app viene distribuita in più computer, può essere utile distribuire un certificato X.509 condiviso tra i computer e configurare le app ospitate per usare il certificato per la crittografia delle chiavi inattivi:

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

A causa delle limitazioni di .NET Framework, sono supportati solo i certificati con chiavi private CAPI. Per le possibili soluzioni alternative a queste limitazioni, vedere il contenuto seguente.

Windows DPAPI-NG

Questo meccanismo è disponibile solo in Windows 8/Windows Server 2012 o versione successiva.

A partire da Windows 8, il sistema operativo Windows supporta DPAPI-NG (detto anche DPAPI CNG). Per altre informazioni, vedere Informazioni su DPAPI CNG.

L'entità viene codificata come regola del descrittore di protezione. Nell'esempio seguente che chiama ProtectKeysWithDpapiNG, solo l'utente aggiunto al dominio con il SID specificato può decrittografare l'anello della chiave:

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

Esiste anche un overload senza parametri di ProtectKeysWithDpapiNG. Usare questo metodo pratico per specificare la regola "SID={CURRENT_ACCOUNT_SID}", dove CURRENT_ACCOUNT_SID è il SID dell'account utente di Windows corrente:

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

In questo scenario, il controller di dominio AD è responsabile della distribuzione delle chiavi di crittografia usate dalle operazioni DPAPI-NG. L'utente di destinazione può decifrare il payload crittografato da qualsiasi computer aggiunto a un dominio ,purché il processo sia in esecuzione con la propria identità.

Crittografia basata su certificati con Windows DPAPI-NG

Se l'app è in esecuzione in Windows 8.1/Windows Server 2012 R2 o versione successiva, è possibile usare Windows DPAPI-NG per eseguire la crittografia basata su certificati. Usare la stringa del descrittore della regola "CERTIFICATE=HashId:THUMBPRINT", dove THUMBPRINT è l'identificazione personale SHA1 con codifica esadecimale del certificato:

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

Qualsiasi app a cui punta questo repository deve essere in esecuzione in Windows 8.1/Windows Server 2012 R2 o versione successiva per decifrare le chiavi.

Crittografia della chiave personalizzata

Se i meccanismi predefiniti non sono appropriati, lo sviluppatore può specificare il proprio meccanismo di crittografia delle chiavi fornendo un oggetto personalizzato IXmlEncryptor.