Szyfrowanie kluczy magazynowanych w systemach Windows i Azure przy użyciu platformy ASP.NET Core

System ochrony danych domyślnie wykorzystuje mechanizm odnajdywania, aby określić, jak klucze kryptograficzne powinny być szyfrowane w spoczynku. Deweloper może zastąpić mechanizm odnajdywania i ręcznie określić sposób szyfrowania kluczy magazynowanych.

Ostrzeżenie

Jeśli określisz jawną lokalizację trwałości klucza, system ochrony danych wyrejestruje domyślne szyfrowanie kluczy magazynowanych. W związku z tym klucze nie są już szyfrowane w spoczynku. Zalecamy określenie jawnego mechanizmu szyfrowania kluczy dla wdrożeń produkcyjnych. Opcje mechanizmu szyfrowania magazynowanego zostały opisane w tym temacie.

Azure Key Vault

Aby przechowywać klucze w usłudze Azure Key Vault, skonfiguruj system przy użyciu ProtectKeysWithAzureKeyVault klasy Startup :

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

Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault.

Windows DPAPI

Dotyczy tylko wdrożeń systemu Windows.

Gdy używany jest interfejs DPAPI systemu Windows, materiał klucza jest szyfrowany za pomocą CryptProtectData przed utrwalone w magazynie. DPAPI to odpowiedni mechanizm szyfrowania danych, który nigdy nie jest odczytywany poza bieżącą maszyną (choć można utworzyć kopię zapasową tych kluczy do usługi Active Directory). Aby skonfigurować szyfrowanie kluczy DPAPI magazynowanych, wywołaj jedną z ProtectKeysWithDpapimetod rozszerzenia :

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

Jeśli ProtectKeysWithDpapi jest wywoływana bez parametrów, tylko bieżące konto użytkownika systemu Windows może odszyfrować utrwalone pierścień kluczy. Opcjonalnie można określić, że dowolne konto użytkownika na maszynie (nie tylko bieżące konto użytkownika) może odszyfrować pierścień kluczy:

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

Certyfikat X.509

Jeśli aplikacja jest rozłożona na wiele maszyn, może być wygodne dystrybuowanie udostępnionego certyfikatu X.509 na maszynach i skonfigurowanie hostowanych aplikacji do używania certyfikatu do szyfrowania kluczy magazynowanych:

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

Ze względu na ograniczenia programu .NET Framework obsługiwane są tylko certyfikaty z kluczami prywatnymi CAPI. Zapoznaj się z poniższą zawartością, aby uzyskać możliwe obejścia tych ograniczeń.

Windows DPAPI-NG

Ten mechanizm jest dostępny tylko w systemie Windows 8/Windows Server 2012 lub nowszym.

Począwszy od systemu Windows 8, system operacyjny Windows obsługuje dpAPI-NG (nazywany również CNG DPAPI). Aby uzyskać więcej informacji, zobacz About CNG DPAPI (Informacje o interfejsie DPAPI CNG).

Podmiot zabezpieczeń jest kodowany jako reguła deskryptora ochrony. W poniższym przykładzie, który wywołuje ProtectKeysWithDpapiNGmetodę , tylko użytkownik przyłączony do domeny z określonym identyfikatorem SID może odszyfrować pierścień kluczy:

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

Istnieje również bez parametrów przeciążenie .ProtectKeysWithDpapiNG Użyj tej metody wygody, aby określić regułę "SID={CURRENT_ACCOUNT_SID}", gdzie CURRENT_ACCOUNT_SID jest identyfikatorem SID bieżącego konta użytkownika systemu Windows:

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

W tym scenariuszu kontroler domeny usługi AD jest odpowiedzialny za dystrybucję kluczy szyfrowania używanych przez operacje DPAPI-NG. Użytkownik docelowy może odszyfrować zaszyfrowany ładunek z dowolnej maszyny przyłączonej do domeny (pod warunkiem, że proces jest uruchomiony w ramach swojej tożsamości).

Szyfrowanie oparte na certyfikatach za pomocą interfejsu DPAPI-NG systemu Windows

Jeśli aplikacja jest uruchomiona w systemie Windows 8.1/Windows Server 2012 R2 lub nowszym, możesz użyć systemu Windows DPAPI-NG do przeprowadzenia szyfrowania opartego na certyfikatach. Użyj ciągu deskryptora reguły "CERTIFICATE=HashId:THUMBPRINT", gdzie ODCISK PALCA to zakodowany szesnastkowy odcisk palca SHA1 certyfikatu:

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

Każda aplikacja wskazywana na to repozytorium musi być uruchomiona w systemie Windows 8.1/Windows Server 2012 R2 lub nowszym, aby odszyfrować klucze.

Niestandardowe szyfrowanie kluczy

Jeśli mechanizmy wbudowane nie są odpowiednie, deweloper może określić własny mechanizm szyfrowania kluczy, udostępniając niestandardowy IXmlEncryptorelement .