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

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

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

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

Azure Key Vault

Чтобы сохранить ключи в Azure Key Vault, настройте систему с ProtectKeysWithAzureKeyVault помощью Startup класса:

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

Дополнительные сведения см. в разделе "Настройка ASP.NET Core Data Protection: ProtectKeysWithAzureKeyVault".

Windows DPAPI

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

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

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

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

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

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

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

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

Из-за ограничений платформа .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:THU МБ PRINT, где THU МБ PRINT — это шестнадцатеричный отпечаток SHA1 сертификата:

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

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

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

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