Руководство по разработке приложения .NET Framework с помощью Always Encrypted с безопасными анклавами

Область применения: SQL Server 2019 (15.x) и более поздних версий — только база данных SQL Azure Для Windows

В этом руководстве содержатся сведения о разработке приложения, которое выполняет запросы к базе данных, использующие безопасный анклав на стороне сервера для Always Encrypted с защищенными анклавами.

Заметка

Платформа .NET Framework не поддерживает использование Always Encrypted с анклавами VBS без аттестации. Это руководство применимо только в том случае, если вы используете аттестацию с аттестацией Microsoft Azure (с анклавами Intel SGX в базе данных SQL Azure) или службой защиты узлов (с анклавами VBS в SQL Server).

Предварительные условия

Убедитесь, что вы выполнили одно из руководств по началу работы с Always Encrypted с безопасными анклавами , прежде чем выполнить приведенные ниже действия, описанные в этом руководстве.

Вам также потребуется Visual Studio (версия 2022 рекомендуется) — скачать его из https://visualstudio.microsoft.com/. На компьютере для разработки приложений должна быть установлена платформа .NET Framework 4.7.2 или более поздней версии.

Шаг 1. Настройка проекта Visual Studio

Чтобы использовать функцию Always Encrypted с безопасными анклавами в приложении .NET Framework, вам нужно убедиться в том, что приложение создано на основе .NET Framework 4.7.2 и интегрировано с пакетом NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders. Кроме того, при хранении главного ключа столбца в Azure Key Vault также необходимо интегрировать приложение с Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider NuGet версии 2.4.0 или более поздней.

  1. Откройте Visual Studio.

  2. Создайте проект консольного приложения C# (.NET Framework).

  3. Убедитесь, что в проекте настроена по крайней мере платформа .NET Framework 4.7.2. Щелкните правой кнопкой мыши проект в Обозревателе решений, выберите Свойства и установите для параметра Целевая платформа значение ".NET Framework 4.7.2".

  4. Установите следующий пакет NuGet. Щелкните Инструменты (главное меню) >Диспетчер пакетов NuGet>Консоль диспетчера пакетов. Выполните следующий код в консоли диспетчера пакетов.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders -IncludePrerelease
    
  5. Если вы используете Azure Key Vault для хранения главных ключей столбцов, установите следующие пакеты NuGet, щелкнув Инструменты (главное меню) >Диспетчер пакетов NuGet>Консоль диспетчера пакетов. Выполните следующий код в консоли диспетчера пакетов.

    Install-Package Microsoft.SqlServer.Management.AlwaysEncrypted.AzureKeyVaultProvider -IncludePrerelease -Version 2.4.0
    Install-Package Microsoft.IdentityModel.Clients.ActiveDirectory
    
  6. Откройте файл App.config для проекта.

  7. Откройте раздел <configuration> и добавьте или обновите разделы <configSections>.

    1. Если в разделе <configuration>нет раздела <configSections>, добавьте приведенное ниже содержимое сразу после раздела <configuration>.

      <configSections>
        <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      </configSections>
      
    2. Если в разделе <configuration> уже содержится раздел <configSections>, добавьте следующую строку в раздел <configSections>:

      <section name="SqlColumnEncryptionEnclaveProviders"  type="System.   Data.SqlClient.   SqlColumnEncryptionEnclaveProviderConfigurationSection, System.   Data,  Version=4.0.0.0, Culture=neutral,    PublicKeyToken=b77a5c561934e089" />
      
  8. В разделе <configuration> ниже </configSections> добавьте новый раздел, в котором указан поставщик анклава, который будет использоваться для подтверждения анклавов на стороне сервера и взаимодействия с ними.

    1. Если вы используете службу защиты SQL Server и узла (HGS) (вы используете базу данных из руководства. Начало работы с Always Encrypted с безопасными анклавами в SQL Server), добавьте следующий раздел.

      <SqlColumnEncryptionEnclaveProviders>
        <providers>
          <add name="VBS"  type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider,  Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders,    Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
        </providers>
      </SqlColumnEncryptionEnclaveProviders>
      

      Ниже приведен полный пример файла app.config для простого консольного приложения.

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <configSections>
          <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </configSections>
        <SqlColumnEncryptionEnclaveProviders>
          <providers>
            <add name="VBS"  type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider,  Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders,    Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"/>
          </providers>
        </SqlColumnEncryptionEnclaveProviders>
        <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
        </startup>
      </configuration>
      
    2. Если вы используете базу данных SQL Azure с анклавами SGX и аттестацией Microsoft Azure (вы используете базу данных из руководства. Начало работы с Always Encrypted с безопасными анклавами Intel SGX в Базе данных SQL Azure) добавьте следующий раздел.

      <SqlColumnEncryptionEnclaveProviders>
        <providers>
          <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
        </providers>
      </SqlColumnEncryptionEnclaveProviders>
      

      Ниже приведен полный пример файла app.config для простого консольного приложения.

      <?xml version="1.0" encoding="utf-8" ?>
      <configuration>
        <configSections>
          <section name="SqlColumnEncryptionEnclaveProviders" type="System.Data.SqlClient.SqlColumnEncryptionEnclaveProviderConfigurationSection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </configSections>
        <SqlColumnEncryptionEnclaveProviders>
          <providers>
            <add name="SGX" type="Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider, Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders, Version=15.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
          </providers>
        </SqlColumnEncryptionEnclaveProviders>
        <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
        </startup>
      </configuration>
      

Шаг 2. Реализация логики приложения

Приложение будет подключаться к базе данных ContosoHR , созданной в одном из учебников, см . предварительные требования и будет выполнять запрос, содержащий LIKE предикат в столбце SSN , и сравнение диапазона по столбцу "Зарплата ".

  1. Замените содержимое файла Program.cs (созданного в Visual Studio) на приведенный ниже код. Обновите строку подключения к базе данных, указав имя сервера, параметры проверки подлинности и URL-адрес аттестации анклава для своей среды.

    using System;
    using System.Data.SqlClient;
    using System.Data;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
    
                string connectionString = "Data Source = myserver; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = http://hgs.bastion.local/Attestation; Integrated Security = true";
    
                //string connectionString = "Data Source = myserver.database.windows.net; Initial Catalog = ContosoHR; Column Encryption Setting = Enabled;Enclave Attestation Url = https://myattestationprovider.uks.attest.azure.net/attest/SgxEnclave; User ID=user; Password=password";
    
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
    
                    SqlCommand cmd = connection.CreateCommand();
                    cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [Salary] FROM [HR].[Employees] WHERE [SSN] LIKE @SSNPattern AND [Salary] > @MinSalary;";
    
                    SqlParameter paramSSNPattern = cmd.CreateParameter();
    
                    paramSSNPattern.ParameterName = @"@SSNPattern";
                    paramSSNPattern.DbType = DbType.AnsiStringFixedLength;
                    paramSSNPattern.Direction = ParameterDirection.Input;
                    paramSSNPattern.Value = "%9838";
                    paramSSNPattern.Size = 11;
    
                    cmd.Parameters.Add(paramSSNPattern);
    
                    SqlParameter MinSalary = cmd.CreateParameter();
    
                    MinSalary.ParameterName = @"@MinSalary";
                    MinSalary.DbType = DbType.Currency;
                    MinSalary.Direction = ParameterDirection.Input;
                    MinSalary.Value = 20000;
    
                    cmd.Parameters.Add(MinSalary);
                    cmd.ExecuteNonQuery();
    
                    SqlDataReader reader = cmd.ExecuteReader();
                    while (reader.Read())
    
                    {
                        Console.WriteLine(reader[0] + ", " + reader[1] + ", " + reader[2] + ", " + reader[3]);
                    }   
                    Console.ReadKey();
                }
            }
        }
    }
    
  2. Выполните сборку приложения и запустите его.

См. также