Konfigurowanie ochrony danych ASP.NET CoreConfigure ASP.NET Core Data Protection

Gdy system ochrony danych jest zainicjowany, stosuje Ustawienia domyślne w oparciu o środowisko operacyjne.When the Data Protection system is initialized, it applies default settings based on the operational environment. Te ustawienia są zwykle odpowiednie dla aplikacji uruchomionych na pojedynczym komputerze.These settings are generally appropriate for apps running on a single machine. Istnieją przypadki, w których deweloper może chcieć zmienić ustawienia domyślne:There are cases where a developer may want to change the default settings:

  • Aplikacja jest rozłożona na wiele maszyn.The app is spread across multiple machines.
  • Ze względów zgodności.For compliance reasons.

W tych scenariuszach system ochrony danych oferuje bogaty interfejs API konfiguracji.For these scenarios, the Data Protection system offers a rich configuration API.

Ostrzeżenie

Podobnie jak w przypadku plików konfiguracji pierścień klucza ochrony danych powinien być chroniony przy użyciu odpowiednich uprawnień.Similar to configuration files, the data protection key ring should be protected using appropriate permissions. Możesz zaszyfrować klucze w spoczynku, ale nie uniemożliwi to osobom atakującym tworzenie nowych kluczy.You can choose to encrypt keys at rest, but this doesn't prevent attackers from creating new keys. W związku z tym ma to wpływ na zabezpieczenia aplikacji.Consequently, your app's security is impacted. Dostęp do lokalizacji magazynu skonfigurowanej przy użyciu ochrony danych powinien być ograniczony do samej aplikacji, podobnie jak w przypadku ochrony plików konfiguracyjnych.The storage location configured with Data Protection should have its access limited to the app itself, similar to the way you would protect configuration files. Na przykład jeśli zdecydujesz się na przechowywanie magazynu kluczy na dysku, użyj uprawnień systemu plików.For example, if you choose to store your key ring on disk, use file system permissions. Upewnij się, że tylko tożsamość, w ramach której działa aplikacja sieci Web, ma uprawnienia do odczytu, zapisu i tworzenia dostępu do tego katalogu.Ensure only the identity under which your web app runs has read, write, and create access to that directory. W przypadku korzystania z usługi Azure Blob Storage tylko aplikacja sieci Web powinna mieć możliwość odczytywania, zapisywania lub tworzenia nowych wpisów w magazynie obiektów BLOB itd.If you use Azure Blob Storage, only the web app should have the ability to read, write, or create new entries in the blob store, etc.

Metoda rozszerzająca AddDataProtection zwraca IDataProtectionBuilder.The extension method AddDataProtection returns an IDataProtectionBuilder. IDataProtectionBuilder Opisuje metody rozszerzające, które można połączyć ze sobą w celu skonfigurowania opcji ochrony danych.IDataProtectionBuilder exposes extension methods that you can chain together to configure Data Protection options.

W przypadku rozszerzeń ochrony danych używanych w tym artykule wymagane są następujące pakiety NuGet:The following NuGet packages are required for the Data Protection extensions used in this article:

ProtectKeysWithAzureKeyVaultProtectKeysWithAzureKeyVault

Zaloguj się do platformy Azure przy użyciu interfejsu wiersza polecenia, na przykład:Log in to Azure using the CLI, for example:

az login

Aby przechowywać klucze w Azure Key Vault, skonfiguruj system przy użyciu ProtectKeysWithAzureKeyVault w Startup klasie.To store keys in Azure Key Vault, configure the system with ProtectKeysWithAzureKeyVault in the Startup class. blobUriWithSasToken to pełny identyfikator URI, w którym powinien być przechowywany plik klucza.blobUriWithSasToken is the full URI where the key file should be stored. Identyfikator URI musi zawierać token sygnatury dostępu współdzielonego jako parametr ciągu zapytania:The URI must contain the SAS token as a query string parameter:

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

Ustaw lokalizację magazynu kluczy (na przykład PersistKeysToAzureBlobStorage).Set the key ring storage location (for example, PersistKeysToAzureBlobStorage). Należy ustawić lokalizację, ponieważ wywołuje ProtectKeysWithAzureKeyVault implementację IXmlEncryptor , która wyłącza ustawienia automatycznego ochrony danych, w tym lokalizację magazynu kluczy.The location must be set because calling ProtectKeysWithAzureKeyVault implements an IXmlEncryptor that disables automatic data protection settings, including the key ring storage location. W powyższym przykładzie używa się usługi Azure Blob Storage, aby zachować pierścień kluczy.The preceding example uses Azure Blob Storage to persist the key ring. Aby uzyskać więcej informacji, zobacz dostawcy magazynu kluczy: Azure Storage.For more information, see Key storage providers: Azure Storage. Możesz również utrwalać pierścień kluczy lokalnie za pomocą PersistKeysToFileSystem.You can also persist the key ring locally with PersistKeysToFileSystem.

keyIdentifierJest to identyfikator klucza magazynu kluczy używany do szyfrowania klucza.The keyIdentifier is the key vault key identifier used for key encryption. Na przykład klucz utworzony w magazynie kluczy o nazwie dataprotection w contosokeyvault ma identyfikator klucza https://contosokeyvault.vault.azure.net/keys/dataprotection/ .For example, a key created in key vault named dataprotection in the contosokeyvault has the key identifier https://contosokeyvault.vault.azure.net/keys/dataprotection/. Podaj aplikację z odwinięciem klucza i zawiń uprawnienia klucza do magazynu kluczy.Provide the app with Unwrap Key and Wrap Key permissions to the key vault.

ProtectKeysWithAzureKeyVault przeciążeniaProtectKeysWithAzureKeyVault overloads:

Jeśli aplikacja używa wcześniejszych pakietów platformy Azure ( Microsoft.AspNetCore.DataProtection.AzureStorage i Microsoft.AspNetCore.DataProtection.AzureKeyVault ) oraz kombinacji Azure Key Vault i usługi Azure Storage do przechowywania i ochrony kluczy, System.UriFormatException jest generowany, jeśli obiekt blob magazynu kluczy nie istnieje.If the app uses the prior Azure packages (Microsoft.AspNetCore.DataProtection.AzureStorage and Microsoft.AspNetCore.DataProtection.AzureKeyVault) and a combination of Azure Key Vault and Azure Storage to store and protect keys, System.UriFormatException is thrown if the blob for key storage doesn't exist. Obiekt BLOB można utworzyć ręcznie przed uruchomieniem aplikacji w Azure Portal lub użyć następującej procedury:The blob can be manually created ahead of running the app in the Azure portal, or use the following procedure:

  1. Usuń wywołanie do ProtectKeysWithAzureKeyVault pierwszego uruchomienia, aby utworzyć obiekt BLOB w miejscu.Remove the call to ProtectKeysWithAzureKeyVault for the first run to create the blob in place.
  2. Dodaj wywołanie do ProtectKeysWithAzureKeyVault kolejnych uruchomień.Add the call to ProtectKeysWithAzureKeyVault for subsequent runs.

ProtectKeysWithAzureKeyVaultZaleca się usunięcie z pierwszego uruchomienia, ponieważ gwarantuje to, że plik jest tworzony z odpowiednim schematem i wartościami na miejscu.Removing ProtectKeysWithAzureKeyVault for the first run is advised, as it ensures that the file is created with the proper schema and values in place.

Zalecamy uaktualnienie do pakietów Azure. Extensions. AspNetCore. dataprotection. blob i Azure. Extensions. AspNetCore. dataprotection. Keys , ponieważ interfejs API udostępniony automatycznie tworzy obiekt BLOB, jeśli nie istnieje.We recommended upgrading to the Azure.Extensions.AspNetCore.DataProtection.Blobs and Azure.Extensions.AspNetCore.DataProtection.Keys packages because the API provided automatically creates the blob if it doesn't exist.

services.AddDataProtection()
    //This blob must already exist before the application is run
    .PersistKeysToAzureBlobStorage("<storage account connection string", "<key store container name>", "<key store blob name>")
    //Removing this line below for an initial run will ensure the file is created correctly
    .ProtectKeysWithAzureKeyVault(new Uri("<keyIdentifier>"), new DefaultAzureCredential());

PersistKeysToFileSystemPersistKeysToFileSystem

Aby przechowywać klucze w udziale UNC zamiast w domyślnej lokalizacji % LocalAppData% , skonfiguruj system przy użyciu PersistKeysToFileSystem:To store keys on a UNC share instead of at the %LOCALAPPDATA% default location, configure the system with PersistKeysToFileSystem:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
}

Ostrzeżenie

Jeśli zmienisz lokalizację trwałości klucza, system przestanie automatycznie szyfrować klucze w spoczynku, ponieważ nie wie, czy DPAPI jest odpowiednim mechanizmem szyfrowania.If you change the key persistence location, the system no longer automatically encrypts keys at rest, since it doesn't know whether DPAPI is an appropriate encryption mechanism.

ProtectKeysWith*ProtectKeysWith*

System można skonfigurować tak, aby chronił klucze w spoczynku przez wywołanie dowolnego interfejsu API konfiguracji * ProtectKeysWith .You can configure the system to protect keys at rest by calling any of the ProtectKeysWith* configuration APIs. Rozważmy poniższy przykład, który przechowuje klucze w udziale UNC i szyfruje te klucze przy użyciu określonego certyfikatu X. 509:Consider the example below, which stores keys on a UNC share and encrypts those keys at rest with a specific X.509 certificate:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .ProtectKeysWithCertificate("thumbprint");
}

W ASP.NET Core 2,1 lub nowszej można podać X509Certificate2 do ProtectKeysWithCertificate, takie jak certyfikat załadowany z pliku:In ASP.NET Core 2.1 or later, you can provide an X509Certificate2 to ProtectKeysWithCertificate, such as a certificate loaded from a file:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .ProtectKeysWithCertificate(
            new X509Certificate2("certificate.pfx", "password"));
}

Zapoznaj się z tematem szyfrowanie kluczy w spoczynku , aby uzyskać więcej przykładów i dyskusji na temat wbudowanych mechanizmów szyfrowania kluczy.See Key Encryption At Rest for more examples and discussion on the built-in key encryption mechanisms.

UnprotectKeysWithAnyCertificateUnprotectKeysWithAnyCertificate

W ASP.NET Core 2,1 lub nowszych można obrócić certyfikaty i odszyfrować klucze w spoczynku przy użyciu tablicy X509Certificate2 Certificates with UnprotectKeysWithAnyCertificate:In ASP.NET Core 2.1 or later, you can rotate certificates and decrypt keys at rest using an array of X509Certificate2 certificates with UnprotectKeysWithAnyCertificate:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"))
        .ProtectKeysWithCertificate(
            new X509Certificate2("certificate.pfx", "password"));
        .UnprotectKeysWithAnyCertificate(
            new X509Certificate2("certificate_old_1.pfx", "password_1"),
            new X509Certificate2("certificate_old_2.pfx", "password_2"));
}

SetDefaultKeyLifetimeSetDefaultKeyLifetime

Aby skonfigurować system do używania okresu istnienia klucza wynoszącego 14 dni zamiast domyślnego 90 dni, należy użyć SetDefaultKeyLifetime:To configure the system to use a key lifetime of 14 days instead of the default 90 days, use SetDefaultKeyLifetime:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetDefaultKeyLifetime(TimeSpan.FromDays(14));
}

SetapplicationnameSetApplicationName

Domyślnie system ochrony danych izoluje aplikacje od siebie w oparciu o ich ścieżki Główne zawartości , nawet jeśli korzystają one z tego samego repozytorium klucza fizycznego.By default, the Data Protection system isolates apps from one another based on their content root paths, even if they're sharing the same physical key repository. Zapobiega to zrozumieniu przez aplikacje innych chronionych ładunków.This prevents the apps from understanding each other's protected payloads.

Aby udostępnić chronione ładunki między aplikacjami:To share protected payloads among apps:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .SetApplicationName("shared app name");
}

DisableAutomaticKeyGenerationDisableAutomaticKeyGeneration

Może wystąpić scenariusz, w którym aplikacja nie powinna automatycznie rzutować kluczy (utworzyć nowe klucze), ponieważ zbliżają się one do wygaśnięcia.You may have a scenario where you don't want an app to automatically roll keys (create new keys) as they approach expiration. Przykładem mogą być aplikacje skonfigurowane w relacji głównej/pomocniczej, w której tylko podstawowa aplikacja jest odpowiedzialna za problemy związane z zarządzaniem kluczami, a aplikacje pomocnicze po prostu mają widok tylko do odczytu dzwonka klucza.One example of this might be apps set up in a primary/secondary relationship, where only the primary app is responsible for key management concerns and secondary apps simply have a read-only view of the key ring. Aplikacje pomocnicze można skonfigurować do traktowania pierścienia kluczy jako tylko do odczytu przez skonfigurowanie systemu przy użyciu DisableAutomaticKeyGeneration :The secondary apps can be configured to treat the key ring as read-only by configuring the system with DisableAutomaticKeyGeneration:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
        .DisableAutomaticKeyGeneration();
}

Izolacja na poziomie aplikacjiPer-application isolation

Gdy system ochrony danych jest dostarczany przez ASP.NET Core hosta, automatycznie izoluje aplikacje, nawet jeśli te aplikacje działają w ramach tego samego konta procesu roboczego i korzystają z tego samego głównego materiału klucza.When the Data Protection system is provided by an ASP.NET Core host, it automatically isolates apps from one another, even if those apps are running under the same worker process account and are using the same master keying material. Jest to nieco podobne do modyfikatora IsolateApps z elementu System. Web <machineKey> .This is somewhat similar to the IsolateApps modifier from System.Web's <machineKey> element.

Mechanizm izolacji działa, biorąc pod uwagę każdą aplikację na komputerze lokalnym jako unikatową dzierżawę, a tym samym w przypadku każdej z tych aplikacji automatycznie dołączenie IDataProtector identyfikatora aplikacji jako rozróżniacza.The isolation mechanism works by considering each app on the local machine as a unique tenant, thus the IDataProtector rooted for any given app automatically includes the app ID as a discriminator. Unikatowy identyfikator aplikacji jest ścieżką fizyczną aplikacji:The app's unique ID is the app's physical path:

  • W przypadku aplikacji hostowanych w usługach IIS unikatowym IDENTYFIKATORem jest ścieżka fizyczna programu IIS aplikacji.For apps hosted in IIS, the unique ID is the IIS physical path of the app. Jeśli aplikacja jest wdrażana w środowisku kolektywu serwerów sieci Web, ta wartość jest stabilna przy założeniu, że środowiska IIS są skonfigurowane w podobny sposób na wszystkich komputerach w kolektywie serwerów sieci Web.If an app is deployed in a web farm environment, this value is stable assuming that the IIS environments are configured similarly across all machines in the web farm.
  • W przypadku aplikacji, które są uruchomione na serwerze Kestrel, UNIKATOWYm identyfikatorem jest ścieżka fizyczna do aplikacji na dysku.For self-hosted apps running on the Kestrel server, the unique ID is the physical path to the app on disk.

Unikatowy identyfikator został zaprojektowany w celu — przerobienia resetuje zarówno poszczególne aplikacje, jak i maszyny.The unique identifier is designed to survive resets—both of the individual app and of the machine itself.

Ten mechanizm izolacji zakłada, że aplikacje nie są złośliwe.This isolation mechanism assumes that the apps are not malicious. Złośliwa aplikacja zawsze ma wpływ na każdą inną aplikację uruchomioną w ramach tego samego konta procesu roboczego.A malicious app can always impact any other app running under the same worker process account. W udostępnionym środowisku hostingu w przypadku, gdy aplikacje są wzajemnie niezaufane, dostawca hostingu powinien wykonać kroki, aby zapewnić izolację na poziomie systemu operacyjnego między aplikacjami, w tym oddzielić repozytoria klucza podstawowego aplikacji.In a shared hosting environment where apps are mutually untrusted, the hosting provider should take steps to ensure OS-level isolation between apps, including separating the apps' underlying key repositories.

Jeśli system ochrony danych nie jest dostarczany przez hosta ASP.NET Core (na przykład w przypadku wystąpienia go za pośrednictwem DataProtectionProvider konkretnego typu) izolacja aplikacji jest domyślnie wyłączona.If the Data Protection system isn't provided by an ASP.NET Core host (for example, if you instantiate it via the DataProtectionProvider concrete type) app isolation is disabled by default. Gdy izolacja aplikacji jest wyłączona, wszystkie aplikacje obsługiwane przez ten sam materiał klucza mogą współużytkować ładunki, o ile będą one miały odpowiednie cele.When app isolation is disabled, all apps backed by the same keying material can share payloads as long as they provide the appropriate purposes. Aby zapewnić izolację aplikacji w tym środowisku, wywołaj metodę Setapplicationname w obiekcie Configuration i podaj unikatową nazwę dla każdej aplikacji.To provide app isolation in this environment, call the SetApplicationName method on the configuration object and provide a unique name for each app.

Zmienianie algorytmów za pomocą UseCryptographicAlgorithmsChanging algorithms with UseCryptographicAlgorithms

Stos ochrony danych pozwala zmienić domyślny algorytm używany przez nowo generowane klucze.The Data Protection stack allows you to change the default algorithm used by newly-generated keys. Najprostszym sposobem wykonania tej czynności jest wywołanie UseCryptographicAlgorithms z wywołania zwrotnego konfiguracji:The simplest way to do this is to call UseCryptographicAlgorithms from the configuration callback:

services.AddDataProtection()
    .UseCryptographicAlgorithms(
        new AuthenticatedEncryptorConfiguration()
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
    });
services.AddDataProtection()
    .UseCryptographicAlgorithms(
        new AuthenticatedEncryptionSettings()
    {
        EncryptionAlgorithm = EncryptionAlgorithm.AES_256_CBC,
        ValidationAlgorithm = ValidationAlgorithm.HMACSHA256
    });

Domyślnym EncryptionAlgorithm jest AES-256-CBC, a domyślnym ValidationAlgorithm jest HMACSHA256.The default EncryptionAlgorithm is AES-256-CBC, and the default ValidationAlgorithm is HMACSHA256. Zasady domyślne mogą być ustawiane przez administratora systemu za pośrednictwem zasad komputera, ale jawne wywołanie UseCryptographicAlgorithms przesłania zasady domyślne.The default policy can be set by a system administrator via a machine-wide policy, but an explicit call to UseCryptographicAlgorithms overrides the default policy.

Wywołanie UseCryptographicAlgorithms pozwala określić żądany algorytm ze wstępnie zdefiniowanej wbudowanej listy.Calling UseCryptographicAlgorithms allows you to specify the desired algorithm from a predefined built-in list. Nie musisz martwić się o implementację algorytmu.You don't need to worry about the implementation of the algorithm. W powyższym scenariuszu system ochrony danych próbuje użyć implementacji CNG w przypadku uruchamiania w systemie Windows.In the scenario above, the Data Protection system attempts to use the CNG implementation of AES if running on Windows. W przeciwnym razie powraca do zarządzanej klasy System. Security. Cryptography. AES .Otherwise, it falls back to the managed System.Security.Cryptography.Aes class.

Można ręcznie określić implementację za pośrednictwem wywołania UseCustomCryptographicAlgorithms.You can manually specify an implementation via a call to UseCustomCryptographicAlgorithms.

Porada

Zmiana algorytmów nie ma wpływu na istniejące klucze w pęku kluczy.Changing algorithms doesn't affect existing keys in the key ring. Ma to wpływ tylko na nowo wygenerowane klucze.It only affects newly-generated keys.

Określanie niestandardowych algorytmów zarządzanychSpecifying custom managed algorithms

Aby określić niestandardowe algorytmy zarządzane, Utwórz wystąpienie ManagedAuthenticatedEncryptorConfiguration , które wskazuje na typy implementacji:To specify custom managed algorithms, create a ManagedAuthenticatedEncryptorConfiguration instance that points to the implementation types:

serviceCollection.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new ManagedAuthenticatedEncryptorConfiguration()
    {
        // A type that subclasses SymmetricAlgorithm
        EncryptionAlgorithmType = typeof(Aes),

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // A type that subclasses KeyedHashAlgorithm
        ValidationAlgorithmType = typeof(HMACSHA256)
    });

Aby określić niestandardowe algorytmy zarządzane, Utwórz wystąpienie ManagedAuthenticatedEncryptionSettings , które wskazuje na typy implementacji:To specify custom managed algorithms, create a ManagedAuthenticatedEncryptionSettings instance that points to the implementation types:

serviceCollection.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new ManagedAuthenticatedEncryptionSettings()
    {
        // A type that subclasses SymmetricAlgorithm
        EncryptionAlgorithmType = typeof(Aes),

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // A type that subclasses KeyedHashAlgorithm
        ValidationAlgorithmType = typeof(HMACSHA256)
    });

Ogólnie rzecz biorąc * , właściwości typu muszą wskazywać na konkretny, instantiable (za pośrednictwem publicznego elementu ctor bez parametrów) SymmetricAlgorithm i KeyedHashAlgorithm, chociaż system specjalne uwzględnia pewne wartości, takie jak typeof(Aes) dla wygody.Generally the *Type properties must point to concrete, instantiable (via a public parameterless ctor) implementations of SymmetricAlgorithm and KeyedHashAlgorithm, though the system special-cases some values like typeof(Aes) for convenience.

Uwaga

SymmetricAlgorithm musi mieć długość klucza wynoszącą ≥ 128 bitów i rozmiar bloku wynoszący ≥ 64 bitów i musi obsługiwać szyfrowanie w trybie CBC z dopełnieniem #7 PKCS.The SymmetricAlgorithm must have a key length of ≥ 128 bits and a block size of ≥ 64 bits, and it must support CBC-mode encryption with PKCS #7 padding. KeyedHashAlgorithm musi mieć rozmiar podsumowania >= 128 bitów i musi obsługiwać klucze długości równe długości skrótu algorytmu wyznaczania wartości skrótu.The KeyedHashAlgorithm must have a digest size of >= 128 bits, and it must support keys of length equal to the hash algorithm's digest length. KeyedHashAlgorithm nie jest ściśle wymagana jako HMAC.The KeyedHashAlgorithm isn't strictly required to be HMAC.

Określanie niestandardowych algorytmów CNG systemu WindowsSpecifying custom Windows CNG algorithms

Aby określić niestandardowy algorytm Windows CNG przy użyciu szyfrowania w trybie CBC z walidacją HMAC, Utwórz wystąpienie CngCbcAuthenticatedEncryptorConfiguration zawierające informacje o algorytmach:To specify a custom Windows CNG algorithm using CBC-mode encryption with HMAC validation, create a CngCbcAuthenticatedEncryptorConfiguration instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngCbcAuthenticatedEncryptorConfiguration()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // Passed to BCryptOpenAlgorithmProvider
        HashAlgorithm = "SHA256",
        HashAlgorithmProvider = null
    });

Aby określić niestandardowy algorytm Windows CNG przy użyciu szyfrowania w trybie CBC z walidacją HMAC, Utwórz wystąpienie CngCbcAuthenticatedEncryptionSettings zawierające informacje o algorytmach:To specify a custom Windows CNG algorithm using CBC-mode encryption with HMAC validation, create a CngCbcAuthenticatedEncryptionSettings instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngCbcAuthenticatedEncryptionSettings()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256,

        // Passed to BCryptOpenAlgorithmProvider
        HashAlgorithm = "SHA256",
        HashAlgorithmProvider = null
    });

Uwaga

Algorytm szyfrowania bloku symetrycznego musi mieć długość klucza wynoszącą >= 128 bitów, rozmiar bloku >= 64 bitów i musi obsługiwać szyfrowanie w trybie CBC z dopełnieniem #7 PKCS.The symmetric block cipher algorithm must have a key length of >= 128 bits, a block size of >= 64 bits, and it must support CBC-mode encryption with PKCS #7 padding. Algorytm wyznaczania wartości skrótu musi mieć rozmiar Digest >= 128 bitów i musi być obsługiwany przy użyciu _ _ flagi flagi alg uchwytu HMAC (BCRYPT) _ _ .The hash algorithm must have a digest size of >= 128 bits and must support being opened with the BCRYPT_ALG_HANDLE_HMAC_FLAG flag. *Właściwości dostawcy można ustawić na wartość null, aby użyć domyślnego dostawcy dla określonego algorytmu.The *Provider properties can be set to null to use the default provider for the specified algorithm. Aby uzyskać więcej informacji, zobacz dokumentację BCryptOpenAlgorithmProvider .See the BCryptOpenAlgorithmProvider documentation for more information.

Aby określić niestandardowy algorytm Windows CNG przy użyciu szyfrowania Galois/counter z walidacją, Utwórz wystąpienie CngGcmAuthenticatedEncryptorConfiguration zawierające informacje o algorytmach:To specify a custom Windows CNG algorithm using Galois/Counter Mode encryption with validation, create a CngGcmAuthenticatedEncryptorConfiguration instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngGcmAuthenticatedEncryptorConfiguration()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256
    });

Aby określić niestandardowy algorytm Windows CNG przy użyciu szyfrowania Galois/counter z walidacją, Utwórz wystąpienie CngGcmAuthenticatedEncryptionSettings zawierające informacje o algorytmach:To specify a custom Windows CNG algorithm using Galois/Counter Mode encryption with validation, create a CngGcmAuthenticatedEncryptionSettings instance that contains the algorithmic information:

services.AddDataProtection()
    .UseCustomCryptographicAlgorithms(
        new CngGcmAuthenticatedEncryptionSettings()
    {
        // Passed to BCryptOpenAlgorithmProvider
        EncryptionAlgorithm = "AES",
        EncryptionAlgorithmProvider = null,

        // Specified in bits
        EncryptionAlgorithmKeySize = 256
    });

Uwaga

Algorytm szyfrowania bloku symetrycznego musi mieć długość klucza wynoszącą >= 128 bitów, rozmiar bloku równy 128 bitów i musi obsługiwać szyfrowanie GCM.The symmetric block cipher algorithm must have a key length of >= 128 bits, a block size of exactly 128 bits, and it must support GCM encryption. Właściwość EncryptionAlgorithmProvider można ustawić na wartość null, aby użyć domyślnego dostawcy dla określonego algorytmu.You can set the EncryptionAlgorithmProvider property to null to use the default provider for the specified algorithm. Aby uzyskać więcej informacji, zobacz dokumentację BCryptOpenAlgorithmProvider .See the BCryptOpenAlgorithmProvider documentation for more information.

Określanie innych algorytmów niestandardowychSpecifying other custom algorithms

Chociaż nie jest udostępniany jako interfejs API pierwszej klasy, system ochrony danych jest wystarczająco rozszerzalny, aby można było określić niemal dowolny rodzaj algorytmu.Though not exposed as a first-class API, the Data Protection system is extensible enough to allow specifying almost any kind of algorithm. Na przykład można zachować wszystkie klucze zawarte w sprzętowym module zabezpieczeń (HSM) i zapewnić niestandardową implementację podstawowych procedur szyfrowania i odszyfrowywania.For example, it's possible to keep all keys contained within a Hardware Security Module (HSM) and to provide a custom implementation of the core encryption and decryption routines. Aby uzyskać więcej informacji, zobacz IAuthenticatedEncryptor z rozszerzalnością kryptografii Core .See IAuthenticatedEncryptor in Core cryptography extensibility for more information.

Utrwalanie kluczy podczas hostowania w kontenerze platformy DockerPersisting keys when hosting in a Docker container

W przypadku hostowania w kontenerze platformy Docker klucze powinny być utrzymywane w obu:When hosting in a Docker container, keys should be maintained in either:

  • Folder, który jest woluminem platformy Docker, który utrzymuje się poza okresem istnienia kontenera, takim jak udostępniony wolumin lub wolumin zainstalowany na hoście.A folder that's a Docker volume that persists beyond the container's lifetime, such as a shared volume or a host-mounted volume.
  • Dostawca zewnętrzny, taki jak Azure Key Vault lub Redis.An external provider, such as Azure Key Vault or Redis.

Utrwalanie kluczy za pomocą RedisPersisting keys with Redis

Tylko wersje Redis obsługujące trwałość danych Redis powinny być używane do przechowywania kluczy.Only Redis versions supporting Redis Data Persistence should be used to store keys. Magazyn obiektów blob platformy Azure jest trwały i może służyć do przechowywania kluczy.Azure Blob storage is persistent and can be used to store keys. Aby uzyskać więcej informacji, zobacz ten problemw serwisie GitHub.For more information, see this GitHub issue.

Dodatkowe zasobyAdditional resources