Поделиться через


Шифрование ключей при хранении в Windows и Azure с помощью ASP.NET Core

Система защиты данных использует механизм обнаружения по умолчанию, чтобы определить, как шифруются криптографические ключи в состоянии покоя. Разработчик может переопределить механизм обнаружения и вручную указать, как ключи должны быть зашифрованы в состоянии покоя.

Предупреждение

Если указать явное расположение сохраняемости ключа, система защиты данных отменяет регистрацию механизма шифрования ключей по умолчанию. Следовательно, ключи больше не шифруются в состоянии покоя. Рекомендуется указать явный механизм шифрования ключей для рабочих развертываний. В этом разделе описаны параметры механизма шифрования данных в состоянии покоя.

Azure Key Vault

Дополнительные сведения см. в статье Настройка защиты данных в ASP.NET Core.

Windows DPAPI

Применяется только к развертываниям Windows.

При использовании DPAPI Windows материал ключа шифруется с помощью CryptProtectData перед сохранением в хранилище. DPAPI — это подходящий механизм шифрования для данных, которые никогда не считываются за пределами текущего компьютера (хотя эти ключи можно создать в Active Directory). Чтобы настроить шифрование ключа DPAPI в состоянии покоя, вызовите один из методов расширения ProtectKeysWithDpapi.

// Only the local user account can decrypt the keys
services.AddDataProtection()
    .ProtectKeysWithDpapi();

Если ProtectKeysWithDpapi вызывается без параметров, то только текущая учетная запись пользователя Windows может расшифровать сохраненный круг ключей. При необходимости можно указать, что любая учетная запись пользователя на компьютере (а не только текущая учетная запись пользователя) сможет расшифровать кольцо ключей:

// All user accounts on the machine can decrypt the keys
services.AddDataProtection()
    .ProtectKeysWithDpapi(protectToLocalMachine: true);

Сертификат X.509

Если приложение распределено на несколько компьютеров, может быть удобно распределить общий сертификат X.509 (.pfx формат) по машинам и настроить размещенные приложения на использование сертификата для шифрования ключей в состоянии покоя.

В следующем примере отпечаток сертификата передается к ProtectKeysWithCertificate:

services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");

В следующем примере X509Certificate2 передается в ProtectKeysWithCertificate:

var cert = new X509Certificate2(...);

services.AddDataProtection()
    .ProtectKeysWithCertificate(cert);

Чтобы создать сертификат, используйте один из следующих подходов или любое другое подходящее средство или веб-службу.

Дополнительные сведения см. в статье "Создание самозаверяющих сертификатов с помощью .NET CLI".

Из-за ограничений платформа .NET Framework поддерживаются только сертификаты с закрытыми ключами CAPI. Дополнительные сведения об этих ограничениях см. в приведенном ниже содержимом.

Windows DPAPI-NG

Этот механизм доступен только в Windows 8/Windows Server 2012 или более поздней версии.

Начиная с Windows 8 ОС Windows поддерживает DPAPI-NG (также называемый CNG DPAPI). Дополнительные сведения см. в разделе О CNG DPAPI.

Субъект кодируется как правило дескриптора защиты. В следующем примере, который вызывает ProtectKeysWithDpapiNG, только присоединенный к домену пользователь с указанным идентификатором безопасности может расшифровать кольцо ключей:

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

Существует также перегрузка ProtectKeysWithDpapiNGбез параметров. Используйте этот удобный метод, чтобы указать правило SID={CURRENT_ACCOUNT_SID}, где CURRENT_ACCOUNT_SID является идентификатором безопасности текущей учетной записи пользователя Windows:

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

В этом сценарии контроллер домена AD отвечает за распространение ключей шифрования, используемых операциями DPAPI-NG. Целевой пользователь может расшифровать зашифрованные данные с любого устройства в домене (при условии, что процесс выполняется под их учетными данными).

Шифрование на основе сертификатов с помощью Windows DPAPI-NG

Если приложение работает в Windows 8.1/Windows Server 2012 R2 или более поздней версии, можно использовать Windows DPAPI-NG для шифрования на основе сертификатов. Используйте строку дескриптора правила "CERTIFICATE=HashId:{CERTIFICATE THUMBPRINT}", где {CERTIFICATE THUMBPRINT} заполнитель — это шестнадцатерично кодированный отпечаток SHA1 сертификата.

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

Любое приложение, указывающее на этот репозиторий, должно работать в Windows 8.1/Windows Server 2012 R2 или более поздней версии, чтобы расшифровать ключи.

Шифрование пользовательских ключей

Если встроенные механизмы не подходят, разработчик может указать собственный механизм шифрования ключей, предоставив пользовательский IXmlEncryptor.