Using Always Encrypted with the .NET Framework Data Provider for SQL Server (Использование Always Encrypted с поставщиком данных .NET Framework для SQL Server)Using Always Encrypted with the .NET Framework Data Provider for SQL Server

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

В этой статье содержатся сведения о разработке приложений .NET с помощью Always Encrypted или Always Encrypted с безопасными анклавами и Поставщика данных .NET Framework для SQL Server.This article provides information on how to develop .NET applications using Always Encrypted or Always Encrypted with secure enclaves and the .NET Framework Data Provider for SQL Server.

Функция Always Encrypted позволяет шифровать конфиденциальные данные в клиентских приложениях, не раскрывая данные или ключи шифрования для SQL Server или Базы данных SQL Azure.Always Encrypted allows client applications to encrypt sensitive data and never reveal the data or the encryption keys to SQL Server or Azure SQL Database. Драйвер с поддержкой постоянного шифрования, такой как поставщик данных .NET Framework для SQL Server, реализует это за счет прозрачного шифрования и расшифровки конфиденциальных данных в клиентском приложении SQL Server.An Always Encrypted enabled driver, such as the .NET Framework Data Provider for SQL Server, achieves this by transparently encrypting and decrypting sensitive data in the client application. Драйвер автоматически определяет, какие параметры запроса соответствуют важным столбцам базы данных (защищенным с помощью Always Encrypted), и шифрует значения этих параметров перед передачей данных в SQL Server или Базу данных SQL Azure.The driver automatically determines which query parameters correspond to sensitive database columns (protected using Always Encrypted), and encrypts the values of those parameters before passing the data to SQL Server or Azure SQL Database. Аналогичным образом драйвер прозрачно расшифровывает данные, полученные из зашифрованных столбцов базы в результатах запроса.Similarly, the driver transparently decrypts data retrieved from encrypted database columns in query results. Дополнительные сведения см. в разделе Разработка приложений с помощью Always Encrypted и Разработка приложений с помощью Always Encrypted с безопасными анклавами.For more information, see Develop applications using Always Encrypted and Develop applications using Always Encrypted with secure enclaves.

предварительные требованияPrerequisites

  • Настройте функцию постоянного шифрования в базе данных.Configure Always Encrypted in your database. В процесс настройки входят действия по подготовке ключей постоянного шифрования и настройке шифрования для выбранных столбцов базы данных.This involves provisioning Always Encrypted keys and setting up encryption for selected database columns. Если в базе данных Always Encrypted еще не настроен, следуйте инструкциям в разделе Начало работы с Always Encrypted.If you don't already have a database with Always Encrypted configured, follow the directions in Getting Started with Always Encrypted.
  • Убедитесь, что на компьютере, предназначенном для разработки, установлена платформа .NET Framework 4.6.1 или более поздней версии.Ensure .NET Framework version 4.6.1 or higher is installed on your development machine. Дополнительные сведения см. в разделе .NET Framework 4.6.For details, see .NET Framework 4.6. Также необходимо убедиться, что в среде разработки в качестве целевой версии платформы установлена платформа .NET Framework 4.6 или более поздней версии.You also need to ensure .NET Framework version 4.6 or higher is configured as the target .NET Framework version in your development environment. Если вы используете Visual Studio, обратитесь к разделу Руководство. Определение целевой версии платформы .NET Framework.If you're using Visual Studio, please refer to How to: Target a Version of the .NET Framework.

Примечание

Уровень поддержки постоянного шифрования зависит от конкретной версии платформы .NET Framework.The level of support for Always Encrypted in particular versions of .NET Framework varies. Дополнительные сведения см. в разделе справки по API постоянного шифрования ниже.Please, see the Always Encrypted API reference section below for details.

Включение Always Encrypted для запросов приложенийEnabling Always Encrypted for Application Queries

Самым простым способом включения шифрования параметров и расшифровки результатов запросов к зашифрованным столбцам является установка для ключевого слова строки подключения "Параметр шифрования столбца" значения Включено.The easiest way to enable the encryption of parameters, and the decryption of query results targeting the encrypted columns, is by setting the value of the Column Encryption Setting connection string keyword to enabled.

Ниже приведен пример строки подключения, включающий постоянное шифрование.The following is an example of a connection string that enables Always Encrypted:

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
SqlConnection connection = new SqlConnection(connectionString);

Далее приведен эквивалент примера с использованием свойства SqlConnectionStringBuilder.ColumnEncryptionSetting.The following is an equivalent example using the SqlConnectionStringBuilder.ColumnEncryptionSetting Property.

SqlConnectionStringBuilder strbldr = new SqlConnectionStringBuilder();
strbldr.DataSource = "server63";
strbldr.InitialCatalog = "Clinic";
strbldr.IntegratedSecurity = true;
strbldr.ColumnEncryptionSetting = SqlConnectionColumnEncryptionSetting.Enabled;
SqlConnection connection = new SqlConnection(strbldr.ConnectionString);

Постоянное шифрование также можно включить для отдельных запросов.Always Encrypted can also be enabled for individual queries. См. раздел Управление влиянием постоянного шифрования на производительность ниже.See the Controlling performance impact of Always Encrypted section below. Включения функции Always Encrypted недостаточно для успешного шифрования или расшифровки.Enabling Always Encrypted isn't sufficient for encryption or decryption to succeed. Необходимо также проверить выполнение следующих условий:You also need to make sure:

  • Приложение имеет разрешения VIEW ANY COLUMN MASTER KEY DEFINITION и VIEW ANY COLUMN ENCRYPTION KEY DEFINITION для базы данных, необходимые для доступа к метаданным о ключах постоянного шифрования в базе данных.The application has the VIEW ANY COLUMN MASTER KEY DEFINITION and VIEW ANY COLUMN ENCRYPTION KEY DEFINITION database permissions, required to access the metadata about Always Encrypted keys in the database. Для дополнительных сведений см. страницу о разрешениях в статье "Always Encrypted (ядро СУБД)".For details, see Permissions section in Always Encrypted (Database Engine).
  • Приложение может получить доступ к главному ключу столбца, который защищает ключи шифрования столбцов, шифрующие запрашиваемые столбцы базы данных.The application can access the column master key that protects the column encryption keys, encrypting the queried database columns.

Включение Always Encrypted с безопасными анклавамиEnabling Always Encrypted with Secure Enclaves

Начиная с версии .NET Framework 4.7.2 драйвер поддерживает Always Encrypted с безопасными анклавами.Beginning with .NET Framework version 4.7.2, the driver supports Always Encrypted with secure enclaves.

Чтобы включить использование анклава при подключении к SQL Server 2019 (15.x)SQL Server 2019 (15.x) или более поздней версии, необходимо настроить приложение и поставщик данных .NET Framework для SQL Server, чтобы включить вычисления анклава и аттестацию анклава.To enable the use of the enclave when connecting to SQL Server 2019 (15.x)SQL Server 2019 (15.x) or later, you need to configure your application and the .NET Framework Data Provider for SQL Server to enable enclave computations and enclave attestation.

Общие сведения о роли клиентского драйвера в вычислениях анклава и аттестации анклава см. в статье Разработка приложений с помощью Always Encrypted с безопасными анклавами.For general information on the client driver role in enclave computations and enclave attestation, see Develop applications using Always Encrypted with secure enclaves.

Настройка приложения:To configure your application:

  1. Интегрируйте пакет NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders в приложение.Integrate the Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet package with your application. NuGet — это библиотека поставщиков анклавов, которая реализует логику на стороне клиента для протокола аттестации, а также для установки безопасного канала с безопасным анклавом внутри SQL Server.The NuGet is a library of enclave providers, implementing the client-side logic for attestation protocols and for establishing a secure channel with a secure enclave inside SQL Server.
  2. Обновите конфигурацию приложения (например, в файле web.config или app.config), чтобы определить сопоставление для типа анклава, с которым был настроен ваш экземпляр SQL ServerSQL Server (см. раздел Настройка типа анклава для параметра конфигурации сервера Always Encrypted).Update your application configuration (for example in web.config or app.config) to define the mapping between an enclave type, your SQL ServerSQL Server instance has been configured with (see Configure the enclave type for Always Encrypted Server Configuration Option). SQL Server 2019 (15.x)SQL Server 2019 (15.x) поддерживает анклавы VBS и службу защитника узлов для аттестации.SQL Server 2019 (15.x)SQL Server 2019 (15.x) supports VBS enclaves and Host Guardian Service for attestation. Поэтому необходимо соотнести тип анклава VBS с классом Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider из пакета NuGet.Therefore, you need to map the VBS enclave type to the Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider class from the NuGet package.
  3. Включите вычисления анклава для подключения из приложения к базе данных, задав ключевое слово URL-адреса аттестации анклава в строке подключения к конечной точке аттестации.Enable enclave computations for a connection from your application to the database by setting the Enclave Attestation URL keyword in the connection string to an attestation endpoint. В качестве значения ключевого слова следует задать конечную точку аттестации сервера HGS, настроенную в вашей среде.The value of the keyword should be set to the attestation endpoint of the HGS server, configured in your environment.

Пошаговое руководство см. в статье Учебник. Разработка приложения .NET Framework с помощью Always Encrypted с безопасными анклавамиFor a step-by-step tutorial, see Tutorial: Develop a .NET Framework application using Always Encrypted with secure enclaves

Получение и изменение данных в зашифрованных столбцахRetrieving and Modifying Data in Encrypted Columns

После включения постоянного шифрования для запросов приложений можно использовать стандартные API-интерфейсы для ADO.NET (см. раздел Получение и изменение данных в ADO.NET) или API-интерфейсы поставщика данных .NET Framework для SQL Server , определенные в пространстве имен System.Data.SqlClient, чтобы получать или изменять данные в зашифрованных столбцах базы данных.Once you enable Always Encrypted for application queries, you can use standard ADO.NET APIs (see Retrieving and Modifying Data in ADO.NET) or the .NET Framework Data Provider for SQL Server APIs, defined in the System.Data.SqlClient Namespace, to retrieve or modify data in encrypted database columns. Если приложение имеет необходимые разрешения для базы данных и может обращаться к главному ключу столбца, поставщик данных .NET Framework для SQL Server будет шифровать все параметры запроса, предназначенные для зашифрованных столбцов, и расшифровывать данные, извлекаемые из зашифрованных столбцов с возвращаемыми значениями типов .NET в виде открытого текста, которые соответствуют типам данным SQL Server, заданным для столбцов в схеме базы данных.Assuming your application has the required database permissions and can access the column master key, the .NET Framework Data Provider for SQL Server will encrypt any query parameters that target encrypted columns, and will decrypt data retrieved from encrypted columns returning plaintext values of .NET types, corresponding to the SQL Server data types set for the columns in the database schema. Если функция Always Encrypted не включена, выполнение запросов с параметрами, предназначенными для зашифрованных столбцов, завершится ошибкой.If Always Encrypted isn't enabled, queries with parameters that target encrypted columns will fail. Запросы по-прежнему могут получать данные из зашифрованных столбцов, пока для них не будут указаны параметры, предназначенные для зашифрованных столбцов.Queries can still retrieve data from encrypted columns, as long as the query has no parameters targeting encrypted columns. Однако поставщик данных .NET Framework для SQL Server не будет пытаться расшифровать все значения, полученные из зашифрованных столбцов, и приложение будет получать двоичные зашифрованные данные (в виде массивов байтов).However, the .NET Framework Data Provider for SQL Server won't attempt to decrypt any values retrieved from encrypted columns and the application will receive binary encrypted data (as byte arrays).

В приведенной ниже таблице описывается поведение запросов в зависимости от того, включено постоянное шифрование или нет.The below table summarizes the behavior of queries, depending on whether Always Encrypted is enabled or not:

Характеристика запросаQuery characteristic Постоянное шифрование включено, и приложение может получать доступ к ключам и метаданным ключейAlways Encrypted is enabled and application can access the keys and key metadata Функция Always Encrypted включена, и приложение не может получать доступ к ключам и метаданным ключейAlways Encrypted is enabled and application can't access the keys or key metadata Постоянное шифрование отключеноAlways Encrypted is disabled
Запросы с параметрами, предназначенными для зашифрованных столбцов.Queries with parameters targeting encrypted columns. Значения параметров прозрачно шифруются.Parameter values are transparently encrypted. ОшибкаError ОшибкаError
Запросы, получающие данные из зашифрованных столбцов, без параметров, предназначенных для зашифрованных столбцов.Queries retrieving data from encrypted columns, without parameters targeting encrypted columns. Результаты из зашифрованных столбцов прозрачно расшифровываются.Results from encrypted columns are transparently decrypted. Приложение получает значения типов данных .NET в виде открытого текста, которые соответствуют типам SQL Server, настроенным для зашифрованных столбцов.The application receives plaintext values of the .NET datatypes corresponding to the SQL Server types configured for the encrypted columns. ОшибкаError Результаты из зашифрованных столбцов не расшифровываются.Results from encrypted columns aren't decrypted. Приложение получает зашифрованные значения в виде массивов байтов (byte[]).The application receives encrypted values as byte arrays (byte[]).

В следующих примерах показано получение и изменение данных в зашифрованных столбцах.The following examples illustrate retrieving and modifying data in encrypted columns. В примерах предполагается использование целевой таблицы с приведенной ниже схемой.The examples assume the target table with the below schema. Столбцы SSN и BirthDate зашифрованы.The SSN and BirthDate columns are encrypted.

CREATE TABLE [dbo].[Patients]([PatientId] [int] IDENTITY(1,1), 
 [SSN] [char](11) COLLATE Latin1_General_BIN2 
 ENCRYPTED WITH (ENCRYPTION_TYPE = DETERMINISTIC, 
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL,
 [FirstName] [nvarchar](50) NULL,
 [LastName] [nvarchar](50) NULL, 
 [BirthDate] [date] 
 ENCRYPTED WITH (ENCRYPTION_TYPE = RANDOMIZED, 
 ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
 COLUMN_ENCRYPTION_KEY = CEK1) NOT NULL
 PRIMARY KEY CLUSTERED ([PatientId] ASC) ON [PRIMARY])
 GO

Пример вставки данныхInserting Data Example

В этом примере показана вставка строки в таблицу Patients.This example inserts a row into the Patients table. Следует отметить следующее.Note the following:

  • В образце кода нет ничего, связанного с шифрованием.There is nothing specific to encryption in the sample code. Поставщик данных .NET Framework для SQL Server автоматически обнаруживает и шифрует параметры paramSSN и paramBirthdate , предназначенные для зашифрованных столбцов.The .NET Framework Data Provider for SQL Server automatically detects and encrypts the paramSSN and paramBirthdate parameters that target encrypted columns. В этом случае шифрование является прозрачным для приложения.This makes encryption transparent to the application.
  • Значения, вставляемые в столбцы базы данных, включая зашифрованные столбцы, передаются как объекты SqlParameter .The values inserted into database columns, including the encrypted columns, are passed as SqlParameter objects. Несмотря на то, что при отправке значений в незашифрованные столбцы использовать параметр SqlParameter необязательно (но настоятельно рекомендуется, так как он помогает предотвратить внедрение кода SQL), он требуется для значений, предназначенных для зашифрованных столбцов.While using SqlParameter is optional when sending values to non-encrypted columns (although, it's highly recommended because it helps prevent SQL injection), it's required for values targeting encrypted columns. Если значения, вставленные в столбцы SSN или BirthDate, были переданы в качестве литералов, внедренных в инструкцию запроса, выполнение запроса завершится ошибкой, так как поставщик данных .NET Framework для SQL Server не сможет определить значения в зашифрованных столбцах и поэтому не сможет зашифровать значения.If the values inserted in the SSN or BirthDate columns were passed as literals embedded in the query statement, the query would fail because the .NET Framework Data Provider for SQL Server would not be able to determine the values in the target encrypted columns, so it would not encrypt the values. В результате сервер отклонит их как несовместимые с зашифрованными столбцами.As a result, the server would reject them as incompatible with the encrypted columns.
  • Для типа данных параметра, предназначенного для столбца SSN, задана строка ANSI (отличная от Юникода), которая сопоставляется с типом данных char и varchar SQL Server.The data type of the parameter targeting the SSN column is set to an ANSI (non-Unicode) string, which maps to the char/varchar SQL Server data type. Если для типа параметра была задана строка в Юникоде (String), которая сопоставляется с типом данных char и varchar, выполнение запроса завершится ошибкой, так как постоянное шифрование не поддерживает преобразования из зашифрованных значений nchar и nvarchar в зашифрованные значения char и varchar.If the type of the parameter was set to a Unicode string (String), which maps to nchar/nvarchar, the query would fail, as Always Encrypted doesn't support conversions from encrypted nchar/nvarchar values to encrypted char/varchar values. Сведения о сопоставлении типов данных см. в разделе Сопоставления типов данных SQL Server .See SQL Server Data Type Mappings for information about the data type mappings.
  • В качестве типа данных параметра, вставляемого в столбец BirthDate, явным образом задан целевой тип данных SQL Server. Для этого использовалось свойство SqlParameter.SqlDbType Property, а не неявное сопоставление типов .NET с типами данных SQL Server, применяемыми при работе со свойством SqlParameter.DbType Property.The data type of the parameter inserted into the BirthDate column is explicitly set to the target SQL Server data type using SqlParameter.SqlDbType Property, instead of relying on the implicit mapping of .NET types to SQL Server data types applied when using SqlParameter.DbType Property. По умолчанию структура DateTime сопоставляется с типом данных datetime SQL Server.By default, DateTime Structure maps to the datetime SQL Server data type. Так как типом данных столбца BirthDate является date и постоянное шифрование не поддерживает преобразование зашифрованных значений datetime в зашифрованные значения date, использование сопоставления по умолчанию приведет к ошибке.As the data type of the BirthDate column is date and Always Encrypted does not support a conversion of encrypted datetime values to encrypted date values, using the default mapping would result in an error.
string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
using (SqlConnection connection = new SqlConnection(strbldr.ConnectionString))
{
   using (SqlCommand cmd = connection.CreateCommand())
   {
      cmd.CommandText = @"INSERT INTO [dbo].[Patients] ([SSN], [FirstName], [LastName], [BirthDate]) VALUES (@SSN, @FirstName, @LastName, @BirthDate);";

      SqlParameter paramSSN = cmd.CreateParameter();
      paramSSN.ParameterName = @"@SSN";
      paramSSN.DbType = DbType.AnsiStringFixedLength;
      paramSSN.Direction = ParameterDirection.Input;
      paramSSN.Value = "795-73-9838";
      paramSSN.Size = 11;
      cmd.Parameters.Add(paramSSN);

      SqlParameter paramFirstName = cmd.CreateParameter();
      paramFirstName.ParameterName = @"@FirstName";
      paramFirstName.DbType = DbType.String;
      paramFirstName.Direction = ParameterDirection.Input;
      paramFirstName.Value = "Catherine";
      paramFirstName.Size = 50;
      cmd.Parameters.Add(paramFirstName);

      SqlParameter paramLastName = cmd.CreateParameter();
      paramLastName.ParameterName = @"@LastName";
      paramLastName.DbType = DbType.String;
      paramLastName.Direction = ParameterDirection.Input;
      paramLastName.Value = "Abel";
      paramLastName.Size = 50;
      cmd.Parameters.Add(paramLastName);

      SqlParameter paramBirthdate = cmd.CreateParameter();
      paramBirthdate.ParameterName = @"@BirthDate";
      paramBirthdate.SqlDbType = SqlDbType.Date;
      paramBirthdate.Direction = ParameterDirection.Input;
      paramBirthdate.Value = new DateTime(1996, 09, 10);
      cmd.Parameters.Add(paramBirthdate);

      cmd.ExecuteNonQuery();
   } 
}

Пример получения данных в виде открытого текстаRetrieving Plaintext Data Example

В следующем примере показана фильтрация данных на основе зашифрованных значений и получение данных в виде открытого текста из зашифрованных столбцов.The following example demonstrates filtering data based on encrypted values, and retrieving plaintext data from encrypted columns. Следует отметить следующее.Note the following:

  • Значение, используемое в предложении WHERE для фильтрации по столбцу SSN, необходимо передать с помощью SqlParameter, чтобы поставщик данных .NET Framework для SQL Server мог его прозрачно зашифровать перед отправкой в базу данных.The value used in the WHERE clause to filter on the SSN column needs to be passed using SqlParameter, so that the .NET Framework Data Provider for SQL Server can transparently encrypt it before sending it to the database.
  • Все значения, выводимые программой, будут представлены в виде обычного текста, так как поставщик данных .NET Framework для SQL Server прозрачно расшифровывает данные, полученные из столбцов SSN и BirthDate.All values printed by the program will be in plaintext, as the .NET Framework Data Provider for SQL Server will transparently decrypt the data retrieved from the SSN and BirthDate columns.

Примечание

Запросы могут выполнять сравнение на равенство для столбцов, если они шифруются с помощью детерминированного шифрования.Queries can perform equality comparisons on columns if they are encrypted using deterministic encryption. Дополнительные сведения см. в разделе Выбор детерминированного или случайного шифрования.For more information, see Selecting Deterministic or Randomized Encryption.

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true; Column Encryption Setting=enabled";
    
using (SqlConnection connection = new SqlConnection(strbldr.ConnectionString))
 {
    using (SqlCommand cmd = connection.CreateCommand())
 {

 cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN=@SSN";
 SqlParameter paramSSN = cmd.CreateParameter();
 paramSSN.ParameterName = @"@SSN";
 paramSSN.DbType = DbType.AnsiStringFixedLength;
 paramSSN.Direction = ParameterDirection.Input;
 paramSSN.Value = "795-73-9838";
 paramSSN.Size = 11;
 cmd.Parameters.Add(paramSSN);
 using (SqlDataReader reader = cmd.ExecuteReader())
 {
   if (reader.HasRows)
 {
 while (reader.Read())
 {
    Console.WriteLine(@"{0}, {1}, {2}, {3}", reader[0], reader[1], reader[2], ((DateTime)reader[3]).ToShortDateString());
 }

Пример получения зашифрованных данныхRetrieving Encrypted Data Example

Если постоянное шифрование не включено, запрос может получать данные из зашифрованных столбцов, пока для него не будут указаны параметры, предназначенные для зашифрованных столбцов.If Always Encrypted is not enabled, a query can still retrieve data from encrypted columns, as long as the query has no parameters targeting encrypted columns.

В следующем примере показано извлечение двоичных зашифрованных данных из зашифрованных столбцов.The following example demonstrates how to retrieve binary encrypted data from encrypted columns. Следует отметить следующее.Note the following:

  • Так как постоянное шифрование не включено в строке подключения, запрос будет возвращать зашифрованные значения SSN и BirthD в виде байтовых массивов (программа преобразует значения в строки).As Always Encrypted is not enabled in the connection string, the query will return encrypted values of SSN and BirthDate as byte arrays (the program converts the values to strings).
  • Запрос, получающий данные из зашифрованных столбцов с отключенным постоянным шифрованием, может иметь параметры при условии, что ни один из параметров не предназначен для зашифрованного столбца.A query retrieving data from encrypted columns with Always Encrypted disabled can have parameters, as long as none of the parameters target an encrypted column. Приведенный выше запрос выполняет фильтрацию по LastName, который не зашифрован в базе данных.The above query filters by LastName, which isn't encrypted in the database. Запрос, отфильтрованный по SSN или BirthDate, завершится ошибкой.If the query filtered by SSN or BirthDate, the query would fail.
string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true";
                
using (SqlConnection connection = new SqlConnection(connectionString))
{
   connection.Open();
   using (SqlCommand cmd = connection.CreateCommand())
   {
      cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName]=@LastName";
      SqlParameter paramLastName = cmd.CreateParameter();
      paramLastName.ParameterName = @"@LastName";
      paramLastName.DbType = DbType.String;
      paramLastName.Direction = ParameterDirection.Input;
      paramLastName.Value = "Abel";
      paramLastName.Size = 50;
      cmd.Parameters.Add(paramLastName);
      using (SqlDataReader reader = cmd.ExecuteReader())
      {
         if (reader.HasRows)
         {
            while (reader.Read())
         {
         Console.WriteLine(@"{0}, {1}, {2}, {3}", BitConverter.ToString((byte[])reader[0]), reader[1], reader[2], BitConverter.ToString((byte[])reader[3]));
      }
   }
}

Как избежать распространенных проблем при запросе зашифрованных столбцовAvoiding common problems when querying encrypted columns

В этом разделе описываются общие категории ошибок, возникающих при выполнении запросов к зашифрованным столбцам из приложений .NET, и приводятся рекомендации о том, как их избежать.This section describes common categories of errors when querying encrypted columns from .NET applications and a few guidelines on how to avoid them.

Ошибки преобразования неподдерживаемых типов данныхUnsupported data type conversion errors

Постоянное шифрование поддерживает несколько преобразований для зашифрованных типов данных.Always Encrypted supports few conversions for encrypted data types. Подробный список поддерживаемых преобразований типов см. в статье Always Encrypted.See Always Encrypted for a detailed list of supported type conversions. Чтобы избежать ошибок при преобразовании типов данных, сделайте следующее:Do the following to avoid data type conversion errors:

  • Задайте типы параметров, предназначенных для зашифрованных столбцов, так, чтобы тип данных SQL Server параметра точно совпадал с типом целевого столбца или чтобы поддерживалось преобразование типа данных SQL Server параметра в целевой тип столбца.Set the types of parameters targeting encrypted columns, so the SQL Server data type of the parameter is either exactly the same as the type of the target column, or a conversion of the SQL Server data type of the parameter to the target type of the column is supported. С помощью свойства SqlParameter.SqlDbType можно принудительно задать нужное сопоставление типов данных .NET с конкретными типами данных SQL Server.You can enforce the desired mapping of .NET data types to specific SQL Server data types by using SqlParameter.SqlDbType Property.
  • Убедитесь, что точность и масштаб параметров, предназначенных для столбцов типов данных SQL Server decimal и numeric, соответствуют точности и масштабу, настроенным для целевого столбца.Verify the precision and scale of parameters targeting columns of the decimal and numeric SQL Server data types is the same as the precision and scale configured for the target column.
  • Убедитесь, что точность параметров, предназначенных для столбцов типов данных SQL Server datetime2, datetimeoffset или time, не превышает точность для целевого столбца (в запросах, которые изменяют значения целевого столбца).Verify the precision of parameters targeting columns of datetime2, datetimeoffset, or time SQL Server data types is not greater than the precision for the target column (in queries that modify values in the target column).

Ошибки, возникающие из-за передачи значений в виде открытого текста, а не в зашифрованном видеErrors due to passing plaintext instead of encrypted values

Любое значение, предназначенное для зашифрованного столбца, должно быть зашифровано внутри приложения.Any value that targets an encrypted column needs to be encrypted inside the application. Попытка вставки, изменения или фильтрации по значению в виде открытого текста в зашифрованном столбце приведет к возникновению ошибки, подобной следующей:An attempt to insert/modify or to filter by a plaintext value on an encrypted column will result in an error similar to this:

System.Data.SqlClient.SqlException (0x80131904): Operand type clash: varchar is incompatible with varchar(8000) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'Clinic') collation_name = 'SQL_Latin1_General_CP1_CI_AS'

Чтобы избежать таких ошибок, убедитесь, что:To prevent such errors, make sure:

  • функция Always Encrypted включена для запросов приложений, предназначенных для зашифрованных столбцов (для строки подключения или в отдельном объекте SqlCommand для конкретного запроса);Always Encrypted is enabled for application queries targeting encrypted columns (for the connection string or in the SqlCommand object for a specific query).
  • для отправки данных, предназначенных для зашифрованных столбцов, используется параметр SqlParameter.You use SqlParameter to send data targeting encrypted columns. В примере ниже показан запрос, который вместо передачи литерала внутри объекта SqlParameter неправильно фильтрует по литералу или константе в зашифрованном столбце (SSN).The following example shows a query that incorrectly filters by a literal/constant on an encrypted column (SSN)(instead of passing the literal inside a SqlParameter object).
using (SqlCommand cmd = connection.CreateCommand())
{
   cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
cmd.ExecuteNonQuery();
}

Работа с хранилищами главных ключей столбцовWorking with Column Master Key Stores

Чтобы зашифровать значение параметра или расшифровать данные в результатах запроса, поставщику данных .NET Framework для SQL Server необходимо получить ключ шифрования столбца, настроенный для целевого столбца.To encrypt a parameter value or to decrypt data in query results, the .NET Framework Data Provider for SQL Server needs to obtain a column encryption key that is configured for the target column. Ключи шифрования столбцов хранятся в зашифрованном виде в метаданных базы данных.Column encryption keys are stored in the encrypted form in the database metadata. Каждый ключ шифрования столбца имеет соответствующий главный ключ столбца, который использовался для шифрования ключа шифрования столбца.Each column encryption key has a corresponding column master key that was used to encrypt the column encryption key. Метаданные базы данных не хранят главные ключи столбцов — они содержат только сведения о хранилище ключей, где находится определенный главный ключ столбца, и расположении ключа в хранилище ключей.The database metadata does not store the column master keys - it only contains the information about a key store containing a particular column master key and the location of the key in the key store.

Чтобы получить значение в виде открытого текста для ключа шифрования столбца, поставщик данных .NET Framework для SQL Server сначала получает метаданные о ключе шифрования столбца и соответствующем ему главном ключе столбца, а затем использует сведения в метаданных для доступа в хранилище ключей, содержащее главный ключ столбца, и для расшифровки ключа шифрования зашифрованных столбцов.To obtain a plaintext value of a column encryption key, the .NET Framework Data Provider for SQL Server first obtains the metadata about both the column encryption key and its corresponding column master key, and then it uses the information in the metadata to contact the key store, containing the column master key, and to decrypt the encrypted column encryption key. Поставщик данных .NET Framework для SQL Server взаимодействует с хранилищем ключей с помощью поставщика хранилища главных ключей столбцов, который является экземпляром класса, производным от класса SqlColumnEncryptionKeyStoreProvider.The .NET Framework Data Provider for SQL Server communicates with a key store using a column master key store provider - which is an instance of a class derived from SqlColumnEncryptionKeyStoreProvider Class.

Процедура получения ключа шифрования столбца:The process to obtain a column encryption key:

  1. Если Always Encrypted включено для запроса, поставщик данных .NET Framework для SQL Server прозрачно вызывает sys.sp_describe_parameter_encryption , чтобы получить метаданные шифрования для параметров, предназначенных для зашифрованных столбцов, если запрос содержит параметры.If Always Encrypted is enabled for a query, the .NET Framework Data Provider for SQL Server transparently calls sys.sp_describe_parameter_encryption to retrieve encryption metadata for parameters targeting encrypted columns, if the query has parameters. Для зашифрованных данных, содержащихся в результатах запроса, SQL Server автоматически присоединяет метаданные шифрования.For encrypted data contained in the results of a query, SQL Server automatically attaches encryption metadata. Сведения о главном ключе столбца включают в себя следующее:The information about the column master key includes:

    • Имя поставщика хранилища ключей, который инкапсулирует хранилище ключей, содержащее главный ключ столбца.The name of a key store provider that encapsulates a key store containing the column master key.
    • Путь к ключу, указывающий положение главного ключа столбца в хранилище ключей.The key path that specifies the location of the column master key in the key store.

    Сведения о ключе шифрования столбца включают в себя следующее:The information about the column encryption key includes:

    • Зашифрованное значение ключа шифрования столбца.The encrypted value of a column encryption key.
    • Имя алгоритма, который использовался для шифрования ключа шифрования столбца.The name of the algorithm that was used to encrypt the column encryption key.
  2. Поставщик данных .NET Framework для SQL Server использует имя поставщика хранилища главных ключей столбцов для поиска объекта поставщика (экземпляр класса, производного от класса SqlColumnEncryptionKeyStoreProvider) во внутренней структуре данных.The .NET Framework Data Provider for SQL Server uses the name of the column master key store provider to look up the provider object (an instance of a class derived from SqlColumnEncryptionKeyStoreProvider Class) in an internal data structure.

  3. Чтобы расшифровать ключ шифрования столбца, поставщик данных .NET Framework для SQL Server вызывает метод SqlColumnEncryptionKeyStoreProvider.DecryptColumnEncryptionKey, передавая путь к главному ключу столбца, зашифрованное значение ключа шифрования столбца и имя алгоритма шифрования, используемого для создания ключа шифрования зашифрованных столбцов.To decrypt the column encryption key, the .NET Framework Data Provider for SQL Server calls SqlColumnEncryptionKeyStoreProvider.DecryptColumnEncryptionKey Method, passing the column master key path, the encrypted value of the column encryption key and the name of the encryption algorithm, used to produce the encrypted column encryption key.

Использование встроенных поставщиков хранилища главных ключей столбцовUsing built-in column master key store providers

В состав поставщика данных .NET Framework для SQL Server входят следующие встроенные поставщики хранилища главных ключей столбцов, которые предварительно зарегистрированы с конкретными именами поставщиков (используемыми для поиска поставщика).The .NET Framework Data Provider for SQL Server comes with the following built-in column master key store providers, which are pre-registered with the specific provider names (used to look up the provider).

ClassClass ОписаниеDescription Имя поставщикаProvider (lookup) name
Класс SqlColumnEncryptionCertificateStoreProviderSqlColumnEncryptionCertificateStoreProvider Class Поставщик для хранилища сертификатов Windows.A provider for Windows Certificate Store. MSSQL_CERTIFICATE_STOREMSSQL_CERTIFICATE_STORE
Класс SqlColumnEncryptionCngProviderSqlColumnEncryptionCngProvider Class

Примечание. Этот поставщик доступен в .NET Framework 4.6.1 или более поздней версии.Note: this provider is available in .NET Framework 4.6.1 and later versions.
Поставщик хранилища ключей, поддерживающий Microsoft Cryptography API: Next Generation (CNG) API.A provider for a key store that supports Microsoft Cryptography API: Next Generation (CNG) API. Как правило, такое хранилище представляет собой аппаратный модуль безопасности — физическое устройство, которое защищает цифровые ключи и управляет ими, а также обеспечивает обработку шифрования.Typically, a store of this type is a hardware security module - a physical device that safeguards and manages digital keys and provides crypto-processing. MSSQL_CNG_STOREMSSQL_CNG_STORE
Класс SqlColumnEncryptionCspProviderSqlColumnEncryptionCspProvider Class

Примечание. Этот поставщик доступен в .NET Framework 4.6.1 или более поздней версии.Note: this provider is available in .NET Framework 4.6.1 or later versions.
Поставщик хранилища ключей, поддерживающий Microsoft Cryptography API (CAPI).A provider for a key store that supports Microsoft Cryptography API (CAPI). Как правило, такое хранилище представляет собой аппаратный модуль безопасности — физическое устройство, которое защищает цифровые ключи и управляет ими, а также обеспечивает обработку шифрования.Typically, a store of this type is a hardware security module - a physical device that safeguards and manages digital keys and provides crypto-processing. MSSQL_CSP_PROVIDERMSSQL_CSP_PROVIDER

Для использования этих поставщиков не требуется изменять код приложения, однако необходимо учесть следующие моменты.You do not need to make any application code changes to use these providers but note the following:

  • Вы (или ваш администратор баз данных) должны проверить правильность имени поставщика, настроенного в метаданных главного ключа столбца, и убедиться, что путь к ключу главного ключа столбца соответствует формату пути к ключу, который является допустимым для данного поставщика.You (or your DBA) need to make sure the provider name, configured in the column master key metadata, is correct and the column master key path complies with the key path format that is valid for a given provider. Для настройки ключей рекомендуется использовать средство, такое как среда SQL Server Management Studio, которое при выполнении инструкции CREATE COLUMN MASTER KEY (Transact-SQL) автоматически создает допустимые имена поставщиков и пути к ключам.It is recommended that you configure the keys using tools such as SQL Server Management Studio, which automatically generates the valid provider names and key paths when issuing the CREATE COLUMN MASTER KEY (Transact-SQL) statement. Дополнительные сведения см. в разделах Configuring Always Encrypted using SQL Server Management Studio (Настройка Always Encrypted с помощью среды SQL Server Management Studio ) и Настройка постоянного шифрования с помощью PowerShell.For more information, see Configuring Always Encrypted using SQL Server Management Studio and Configure Always Encrypted using PowerShell.
  • Убедитесь, что приложение может получить доступ к ключу в хранилище ключей.Ensure your application can access the key in the key store. Для этого может потребоваться предоставить приложению доступ к ключу или хранилищу ключей (в зависимости от хранилища ключей) или выполнить другие действия по настройке конкретного хранилища ключей.This may involve granting your application access to the key and/or the key store, depending on the key store, or performing other key store-specific configuration steps. Например, для доступа к хранилищу, реализующему CNG или CAPI (например, к аппаратному модулю безопасности), на компьютере с приложением необходимо установить библиотеку, реализующую CNG или CAPI для хранилища.For example, to access a key store implementing CNG or CAPI (e.g. a hardware security module), you need to make sure a library implementing CNG or CAPI for your store is installed on your application machine. Дополнительные сведения см. в разделе Создание и хранение главных ключей столбцов для Always Encrypted.For details, see Create and store column master keys for Always Encrypted.

Использование поставщика хранилища ключей AzureUsing Azure Key Vault provider

Хранилище ключей Azure удобно для хранения главных ключей столбцов для постоянного шифрования, особенно в том случае, если приложения размещены в Azure.Azure Key Vault is a convenient option to store and manage column master keys for Always Encrypted (especially if your applications are hosted in Azure). Поставщик данных .NET Framework для SQL Server не содержит встроенный поставщик хранилища главных ключей столбцов для хранилища ключей Azure, но он доступен как пакет Nuget, который можно легко интегрировать в приложение.The .NET Framework Data Provider for SQL Server does not include a built-in column master key store provider for Azure Key Vault, but it is available as a Nuget package, that you can easily integrate with your application. Дополнительные сведения см. в статье Постоянное шифрование: защита конфиденциальных данных в базе данных SQL с помощью шифрования базы данных и хранение ключей шифрования в хранилище ключей Azure.For details, see Always Encrypted - Protect sensitive data in SQL Database with data encryption and store your encryption keys in the Azure Key Vault.

Реализация настраиваемого поставщика хранилища главных ключей столбцовImplementing a custom column master key store provider

Чтобы сохранить главные ключи столбцов в хранилище ключей, не поддерживаемом существующим поставщиком, можно реализовать настраиваемый поставщик, расширив класс SqlColumnEncryptionCngProvider и зарегистрировав поставщик с помощью метода SqlConnection.RegisterColumnEncryptionKeyStoreProviders .If you want to store column master keys in a key store that is not supported by an existing provider, you can implement a custom provider by extending the SqlColumnEncryptionCngProvider Class and registering the provider using the SqlConnection.RegisterColumnEncryptionKeyStoreProviders method.

public class MyCustomKeyStoreProvider : SqlColumnEncryptionKeyStoreProvider
    {
        public override byte[] EncryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] columnEncryptionKey)
        {
            // Logic for encrypting a column encrypted key.
        }
        public override byte[] DecryptColumnEncryptionKey(string masterKeyPath, string encryptionAlgorithm, byte[] EncryptedColumnEncryptionKey)
        {
            // Logic for decrypting a column encrypted key.
        }
    }  
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary\<string, SqlColumnEncryptionKeyStoreProvider> providers =
               new Dictionary\<string, SqlColumnEncryptionKeyStoreProvider>();
            providers.Add("MY_CUSTOM_STORE", customProvider);
            SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers);
            providers.Add(SqlColumnEncryptionCertificateStoreProvider.ProviderName, customProvider);
            SqlConnection.RegisterColumnEncryptionKeyStoreProviders(providers); 
       // ...
        }

    }

Использование поставщиков хранилищ главных ключей столбцов для программной подготовки ключейUsing column master key store providers for programmatic key provisioning

При доступе к зашифрованным столбцам поставщик данных .NET Framework для SQL Server прозрачно находит и вызывает нужный поставщик хранилища главных ключей столбцов, чтобы расшифровать ключи шифрования столбцов.When accessing encrypted columns, the .NET Framework Data Provider for SQL Server transparently finds and calls the right column master key store provider to decrypt column encryption keys. Как правило, обычный код приложения не вызывает поставщики хранилища главных ключей напрямую.Typically, your normal application code does not directly call column master key store providers. Однако можно создать и явным образом вызвать поставщик для программной подготовки ключей постоянного шифрования и управления ими: для создания ключа шифрования зашифрованного столбца и расшифровки ключа шифрования столбца (например, в ходе смены главного ключа столбца).You may, however, instantiate and call a provider explicitly to programmatically provision and manage Always Encrypted keys: to generate an encrypted column encryption key and decrypt a column encryption key (e.g. as part column master key rotation). Дополнительные сведения см. в разделе Общие сведения об управлении ключами для Always Encrypted.For more information, see Overview of key management for Always Encrypted. Реализация собственных средств управления ключами может потребоваться только в том случае, если используется настраиваемый поставщик хранилища ключей.Implementing your own key management tools may be required only if you use a custom key store provider. При использовании ключей, хранящихся в хранилище ключей, для которых существует встроенный поставщик, или в хранилище ключей Azure для управления ключами и их подготовки можно применять существующие средства, такие как SQL Server Management Studio или PowerShell.When using keys stored in keys stores, for which built-in providers exist, and or in Azure Key Vault, you can use existing tools, such as SQL Server Management Studio or PowerShell, to manage and provision keys. В примере ниже показано создание ключа шифрования столбца и использование класса SqlColumnEncryptionCertificateStoreProvider для шифрования ключа с помощью сертификата.The below example, illustrates generating a column encryption key and using SqlColumnEncryptionCertificateStoreProvider Class to encrypt the key with a certificate.

using System.Security.Cryptography;
static void Main(string[] args)
{
    byte[] EncryptedColumnEncryptionKey = GetEncryptedColumnEncryptonKey(); 
    Console.WriteLine("0x" + BitConverter.ToString(EncryptedColumnEncryptionKey).Replace("-", "")); 
    Console.ReadKey();
}

static byte[]  GetEncryptedColumnEncryptonKey()
{
    int cekLength = 32;
    String certificateStoreLocation = "CurrentUser";
    String certificateThumbprint = "698C7F8E21B2158E9AED4978ADB147CF66574180";
    // Generate the plaintext column encryption key.
    byte[] columnEncryptionKey = new byte[cekLength];
    RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();
    rngCsp.GetBytes(columnEncryptionKey);

    // Encrypt the column encryption key with a certificate.
    string keyPath = String.Format(@"{0}/My/{1}", certificateStoreLocation, certificateThumbprint);
    SqlColumnEncryptionCertificateStoreProvider provider = new SqlColumnEncryptionCertificateStoreProvider();
    return provider.EncryptColumnEncryptionKey(keyPath, @"RSA_OAEP", columnEncryptionKey); 
}

Управление влиянием постоянного шифрования на производительностьControlling Performance Impact of Always Encrypted

Поскольку постоянное шифрование является технологией шифрования на стороне клиента, значительное влияние на производительность происходит на стороне клиента, а не в базе данных.Because Always Encrypted is a client-side encryption technology, most of performance overheads are observed on the client side, not in the database. Помимо затрат на операции шифрования и расшифровки существуют и другие источники снижения производительности на стороне клиента:Apart from the cost of encryption and decryption operations, the other sources of performance overheads on the client side are:

  • Дополнительные обращения к базе данных для получения метаданных для параметров запроса.Additional round trips to the database to retrieve metadata for query parameters.
  • Вызовы хранилища главных ключей столбцов для доступа к главному ключу столбца.Calls to a column master key store to access a column master key.

В этом разделе описываются процессы оптимизации производительности, встроенные в поставщик .NET Framework для SQL Server, и способы управления влиянием двух указанных выше факторов на производительность.This section describes the built-in performance optimizations in .NET Framework Provider for SQL Server and how you can control the impact of the above two factors on performance.

Управление обращениями для получения метаданных для параметров запросаControlling round trips to retrieve metadata for query parameters

Если для соединения включена функция Always Encrypted, по умолчанию поставщик данных .NET Framework для SQL Server будет вызывать sys.sp_describe_parameter_encryption для каждого параметризованного запроса, передавая инструкцию запроса (без значений параметров) в SQL Server.If Always Encrypted is enabled for a connection, by default, the .NET Framework Data Provider for SQL Server will call sys.sp_describe_parameter_encryption for each parameterized query, passing the query statement (without any parameter values) to SQL Server. sys.sp_describe_parameter_encryption анализирует инструкцию запроса и для каждого параметра, который должен быть зашифрован, возвращает связанные с шифрованием сведения, позволяющие поставщику данных .NET Framework для SQL Server шифровать значения параметров.sys.sp_describe_parameter_encryption analyzes the query statement to find out if any parameters need to be encrypted, and if so, for each such, it returns the encryption-related information that will allow the .NET Framework Data Provider for SQL Server to encrypt parameter values. Описанное выше поведение обеспечивает высокий уровень прозрачности для клиентского приложения.The above behavior ensures a high level of transparency to the client application. Пока значения, предназначенные для зашифрованных столбцов, передаются поставщику данных .NET Framework для SQL Server в объектах SqlParameter, приложению (и разработчику приложений) не требуется знать, какие запросы получают доступ к зашифрованным столбцам.The application (and the application developer) doesn't need to be aware of which queries access encrypted columns, as long as the values targeting encrypted columns are passed to the .NET Framework Data Provider for SQL Server in SqlParameter objects.

Кэширование метаданных запросаQuery metadata caching

В платформе .NET Framework 4.6.2 и более поздней версии поставщик данных .NET Framework для SQL Server кэширует результаты sys.sp_describe_parameter_encryption для каждой инструкции запроса.In .NET Framework 4.6.2 and later, the .NET Framework Data Provider for SQL Server caches the results of sys.sp_describe_parameter_encryption for each query statement. Следовательно, если одна и та же инструкция запроса выполняется несколько раз, драйвер вызывает sys.sp_describe_parameter_encryption всего один раз.Consequently, if the same query statement is executed multiple times, the driver calls sys.sp_describe_parameter_encryption only once. Кэширование метаданных шифрования для инструкций запроса значительно сокращает затраты ресурсов на получение метаданных из базы данных.Encryption metadata caching for query statements substantially reduces the performance cost of fetching metadata from the database. Кэширование включено по умолчанию.Caching is enabled by default. Можно отключить параметр кэширования метаданных, задав для SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled свойство значение false, однако рекомендуется делать это только в редких случаях, например в описанной ниже ситуации:You can disable parameter metadata caching by setting the SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled Property to false, but doing so isn't recommended except in rare cases like the one described below:

Рассмотрим базу данных с двумя различными схемами: s1 и s2.Consider a database that has two different schemas: s1 and s2. Каждая схема содержит таблицу с одинаковым именем: t.Each schema contains a table with the same name: t. Определения таблиц s1.t и s2.t идентичны за исключением свойств, связанных с шифрованием: столбец с именем "c" в таблице s1.t не шифруется, но он зашифрован в таблице s2.t.The definitions of the s1.t and s2.t tables are identical, except encryption-related properties: A column, named c, in s1.t is not encrypted, and it is encrypted in s2.t. База данных имеет двух пользователей: u1 и u2.The database has two users: u1 and u2. Схема по умолчанию для пользователя u1 — s1.The default schema for the u1 users it s1. Схема по умолчанию для u2 — s2.The default schema for u2 is s2. Приложения .NET открывает два подключения к базе данных, олицетворяя пользователя u1 в одном соединении и пользователя u2 в другом.A .NET application opens two connections to the database, impersonating the u1 user on one connection, and the u2 user on another connection. Приложение отправляет запрос с параметром, предназначенным для столбца c, через соединение для пользователя u1 (запрос не указывает схему, поэтому подразумевается схема пользователя по умолчанию).The application sends a query with a parameter targeting the c column over the connection for user u1 (the query does not specify the schema, so the default user scheme is assumed). Затем приложение отправляет тот же запрос через соединение для пользователя u2.Next, the application sends the same query over the connection for the u2 user. Если кэширование метаданных запроса включено, после первого запроса кэш заполняется метаданными, указывающими, что столбец c, для которого предназначен параметр запроса, не шифруются.If query metadata caching is enabled, after the first query, the cache will be populated with metadata indicating the c column, the query parameter targets, is not encrypted. Так как второй запрос такую же инструкцию запроса, используются сведения, хранящиеся в кэше.As the second query has the identical query statement, the information stored in the cache will be used. В результате драйвер посылает запрос без шифрования параметра (что неверно, так как целевой столбец s2.t.c шифруется), в результате чего происходит утечка значения параметра в формате открытого текста на сервер.As a result, the driver will send the query without encrypting the parameter (which is incorrect, as the target column, s2.t.c, is encrypted), leaking the plaintext value of the parameter to the server. Сервер обнаружит несоответствие и велит драйверу обновить кэш, чтобы приложение могло прозрачно переотправить запрос с правильно зашифрованным значением параметра.The server will detect that incompatibility and it will force the driver to refresh the cache, so the application will transparently resend the query with the correctly encrypted parameter value. В этом случае следует отключить кэширование во избежание утечки конфиденциальных значений на сервер.In such a case, caching should be disabled to prevent leaking sensitive values to the server.

Задание постоянного шифрования на уровне запросаSetting Always Encrypted at the query level

Для управления влиянием процесса получения метаданных шифрования для параметризованных запросов на производительность можно включить постоянное шифрование для отдельных запросов, а не настраивать его для соединения.To control performance impact of retrieving encryption metadata for parameterized queries, you can enable Always Encrypted for individual queries, instead of setting it up for the connection. Таким образом, это гарантирует, что sys.sp_describe_parameter_encryption вызывается только для запросов, которые точно имеют параметры, предназначенные для зашифрованных столбцов.This way, you can ensure that sys.sp_describe_parameter_encryption is invoked only for queries that you know have parameters targeting encrypted columns. Обратите внимание, что в этом случае снижается прозрачность шифрования: при изменении свойств шифрования столбцов базы данных может потребоваться изменить код приложения в соответствии с изменениями схемы.Note, however, that by doing so, you reduce transparency of encryption: if you change encryption properties of your database columns, you may need to change the code of your application to align it with the schema changes.

Примечание

Настройка Always Encrypted на уровне запроса дает ограниченный выигрыш в производительности для платформы .NET 4.6.2 и более поздних версий, где реализовано кэширование метаданных шифрования параметра.Setting Always Encrypted at the query level has limited performance benefits in .NET 4.6.2 and later versions, which implement parameter encryption metadata caching.

Для управления поведением функции Always Encrypted в отдельных запросах необходимо использовать этот конструктор SqlCommand и SqlCommandColumnEncryptionSetting.To control the Always Encrypted behavior of individual queries, you need to use this constructor of SqlCommand and SqlCommandColumnEncryptionSetting. Ниже приведены некоторые полезные рекомендации.Here are some useful guidelines:

  • Если большинство запросов, отправляемых клиентским приложением через подключение к базе данных, получает доступ к зашифрованным столбцам:If most queries a client application sends over a database connection access encrypted columns:
    • Задайте для ключевого слова строки подключения Параметр шифрования столбца значение Включено.Set the Column Encryption Setting connection string keyword to Enabled.
    • Задайте SqlCommandColumnEncryptionSetting.Disabled для отдельных запросов, которые не обращаются к зашифрованным столбцам.Set SqlCommandColumnEncryptionSetting.Disabled for individual queries that do not access any encrypted columns. Будет отключена возможность вызова sys.sp_describe_parameter_encryption и расшифровки всех значений в наборе результатов.This will disable both calling sys.sp_describe_parameter_encryption as well as an attempt to decrypt any values in the result set.
    • Задайте SqlCommandColumnEncryptionSetting.ResultSet для отдельных запросов, которые не имеют параметров, требующих шифрования, но получают данные из зашифрованных столбцов.Set SqlCommandColumnEncryptionSetting.ResultSet for individual queries that do not have any parameters requiring encryption, but retrieve data from encrypted columns. Будет отключена возможность вызова sys.sp_describe_parameter_encryption и шифрования параметров.This will disable calling sys.sp_describe_parameter_encryption and parameter encryption. Запрос сможет расшифровывать результаты из столбцов шифрования.The query will be able to decrypt the results from encryption columns.
  • Если большинство запросов, отправляемых клиентским приложением через подключение к базе данных, не получают доступа к зашифрованным столбцам:If most queries a client application sends over a database connection do not access encrypted columns:
    • Задайте для ключевого слова строки подключения Параметр шифрования столбца значение Отключено.Set the Column Encryption Setting connection string keyword to Disabled.
    • Задайте SqlCommandColumnEncryptionSetting.Enabled для отдельных запросов, имеющих параметры, которые требуется зашифровать.Set SqlCommandColumnEncryptionSetting.Enabled for individual queries that have any parameters that need to be encrypted. Будет включена возможность вызова sys.sp_describe_parameter_encryption и расшифровки результатов запроса, полученных из зашифрованных столбцов.This will enable both calling sys.sp_describe_parameter_encryption as well as the decryption of any query results retrieved from encrypted columns.
    • Задайте SqlCommandColumnEncryptionSetting.ResultSet для запросов, которые не имеют параметров, требующих шифрования, но получают данные из зашифрованных столбцов.Set SqlCommandColumnEncryptionSetting.ResultSet for queries that do not have any parameters requiring encryption, but retrieve data from encrypted columns. Будет отключена возможность вызова sys.sp_describe_parameter_encryption и шифрования параметров.This will disable calling sys.sp_describe_parameter_encryption and parameter encryption. Запрос сможет расшифровывать результаты из столбцов шифрования.The query will be able to decrypt the results from encryption columns.

В следующем примере постоянное шифрование отключено для подключения к базе данных.In the below example, Always Encrypted is disabled for the database connection. Запрос, выполняемый приложением, имеет параметр, предназначенный для незашифрованного столбца LastName.The query, the application issues, has a parameter that targets the LastName column that is not encrypted. Запрос получает данные из зашифрованных столбцов SSN и BirthDate.The query retrieves data from the SSN and BirthDate columns that are both encrypted. В этом случае вызывать sys.sp_describe_parameter_encryption для получения метаданных шифрования не требуется.In such a case, calling sys.sp_describe_parameter_encryption to retrieve encryption metadata is not required. Однако необходимо включить расшифровку результатов запроса, чтобы приложение могло получать значения в виде обычного текста из двух зашифрованных столбцов.However, the decryption of the query results needs to be enabled, so that the application can receive plaintext values from the two encrypted columns. Для этого используется параметр SqlCommandColumnEncryptionSetting.ResultSet.SqlCommandColumnEncryptionSetting.ResultSet setting is used to ensure that.

string connectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand cmd = new SqlCommand(@"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [LastName]=@LastName",
connection, null, SqlCommandColumnEncryptionSetting.ResultSetOnly))
    {
        SqlParameter paramLastName = cmd.CreateParameter();
        paramLastName.ParameterName = @"@LastName";
        paramLastName.DbType = DbType.String;
        paramLastName.Direction = ParameterDirection.Input;
        paramLastName.Value = "Abel";
        paramLastName.Size = 50;
        cmd.Parameters.Add(paramLastName);
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
               if (reader.HasRows)
               {
                  while (reader.Read())
                  {
                     Console.WriteLine(@"{0}, {1}, {2}, {3}", reader[0], reader[1], reader[2], ((DateTime)reader[3]).ToShortDateString());
                  }
               }
            }
  } 
}

Кэширование ключа шифрования столбцаColumn encryption key caching

Чтобы уменьшить количество вызовов к хранилищу главных ключей столбцов для расшифровки ключей шифрования столбцов, поставщик данных .NET Framework для SQL Server кэширует ключи шифрования столбцов с открытым текстом в памяти.To reduce the number of calls to a column master key store to decrypt column encryption keys, the .NET Framework Data Provider for SQL Server caches the plaintext column encryption keys in memory. После получения значения ключа шифрования зашифрованного столбца метаданных базы данных драйвер сначала пытается найти ключ шифрования столбца с открытым текстом, соответствующий зашифрованному значению ключа.After receiving the encrypted column encryption key value from database metadata, the driver first tries to find the plaintext column encryption key, corresponding to the encrypted key value. Драйвер обращается к хранилищу ключей, содержащему главный ключ столбца, только в том случае, если ему не удается найти значение ключа шифрования зашифрованных столбцов в кэше.The driver calls the key store containing the column master key, only if it cannot find the encrypted column encryption key value in the cache.

Примечание

В платформе .NET Framework 4.6 и 4.6.1 записи ключей шифрования столбцов в кэше никогда не удаляются.In .NET Framework 4.6 and 4.6.1, the column encryption key entries in the cache are never evicted. Это означает, что для данного ключа шифрования зашифрованного столбца драйвер обращается в хранилище ключей только один раз за все время существования приложения.This means that for a given encrypted column encryption key, the driver contacts the key store only once during the life time of the application.

В платформе .NET Framework 4.6.2 и более поздних версий записи кэша удаляются по истечении настроенного срока жизни из соображений безопасности.In .NET Framework 4.6.2 and later, the cache entries are evicted after a configurable time-to-live interval for security reasons. Значение по умолчанию для срока жизни составляет 2 часа.The default time-to-live value is 2 hours. Если у вас действуют более строгие требования к безопасности, касающиеся времени кэширования ключей шифрования столбца в виде открытого текста в приложении, это значение можно изменить с помощью свойства SqlConnection.ColumnEncryptionKeyCacheTtl.If you have stricter security requirements about how long column encryption keys can be cached in plaintext in the application, you can change it using the SqlConnection.ColumnEncryptionKeyCacheTtl Property.

Включение дополнительной защиты для скомпрометированного SQL ServerEnabling Additional Protection for a Compromised SQL Server

По умолчанию поставщик данных .NET Framework для SQL Server полагается на систему базы данных (SQL Server или Базу данных SQL Azure), которая предоставляет метаданные о том, какие столбцы базы данных шифруются и как именно.By default, the .NET Framework Data Provider for SQL Server relies on the database system (SQL Server or Azure SQL Database) to provide metadata about which columns in the database are encrypted and how. Метаданные шифрования позволяют поставщику данных .NET Framework для SQL Server шифровать параметры запроса и расшифровывать результаты запроса без получения дополнительных входных данных из приложения, что позволяет значительно сократить число изменений, необходимых для приложения.The encryption metadata enables the .NET Framework Data Provider for SQL Server to encrypt query parameters and decrypt query results without any input from the application, which greatly reduces the number of changes required in the application. Однако если процесс SQL Server скомпрометирован и злоумышленник незаконно изменяет метаданные, которые SQL Server отправляет поставщику данных платформы .NET Framework для SQL Server, злоумышленник получает возможность украсть конфиденциальную информацию.However, if the SQL Server process gets compromised and an attacker tampers with the metadata SQL Server sends to the .NET Framework Data Provider for SQL Server, the attacker might be able to steal sensitive information. В этом разделе описываются интерфейсы API, которые помогают обеспечить дополнительный уровень защиты от таких атак за счет снижения прозрачности.This section describes APIs that help provide an additional level of protection against this type of attack, at the price of reduced transparency.

Принудительное шифрование параметровForcing Parameter Encryption

Прежде чем поставщик данных .NET Framework для SQL Server отправляет параметризованный запрос в SQL Server, он просит SQL Server (путем вызова sys.sp_describe_parameter_encryption) проанализировать инструкцию запроса и предоставить сведения о том, какие параметры запроса должны быть зашифрованы.Before the .NET Framework Data Provider for SQL Server sends a parameterized query to SQL Server, it asks SQL Server (by calling sys.sp_describe_parameter_encryption) to analyze the query statement and provide information about which parameters in the query should be encrypted. Скомпрометированный экземпляр SQL Server может ввести поставщика данных .NET Framework для SQL Server в заблуждение, отправляя метаданные о том, что параметр не предназначен для зашифрованного столбца, хотя этот столбец в базе данных шифруется.A compromised SQL Server instance could mislead the .NET Framework Data Provider for SQL Server by sending the metadata indicating the parameter does not target an encrypted column, despite the fact the column is encrypted in the database. В результате поставщик данных .NET Framework для SQL Server не шифрует значение параметра и отправляет его в формате открытого текста в скомпрометированный экземпляр SQL Server.As a result, the .NET Framework Data Provider for SQL Server would not encrypt the parameter value and it would send it as plaintext to the compromised SQL Server instance.

Чтобы предотвратить подобную атаку, приложение может присвоить свойству SqlParameter.ForceColumnEncryption для параметра значение true.To prevent such an attack, an application can set the SqlParameter.ForceColumnEncryption Property for the parameter to true. Это приводит к тому, что поставщик данных .NET Framework для SQL Server выдает исключение, если полученные им с сервера метаданные указывают, что шифровать параметр не нужно.This will cause the .NET Framework Data Provider for SQL Server to throw an exception, if the metadata, it has received from the server, indicates the parameter does not need to be encrypted.

Хотя использование свойства SqlParameter.ForceColumnEncryption помогает повысить безопасность, оно также снижает прозрачность шифрования для клиентского приложения.Although using the SqlParameter.ForceColumnEncryption Property helps improve security, it also reduces the transparency of encryption to the client application. Если вы обновляете схему базы данных для изменения набора зашифрованных столбцов, вам может потребоваться изменить и само приложение.If you update the database schema to change the set of encrypted columns, you might need to make application changes as well.

В следующем примере кода показано, как с помощью свойства SqlParameter.ForceColumnEncryption предотвратить отправку номеров социального страхования в базу данных в формате открытого текста.The following code sample illustrates using the SqlParameter.ForceColumnEncryption Property to prevent social security numbers to be sent in plaintext to the database.

SqlCommand cmd = _sqlconn.CreateCommand(); 

// Use parameterized queries to access Always Encrypted data. 
 
cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE [SSN] = @SSN;"; 

SqlParameter paramSSN = cmd.CreateParameter(); 
paramSSN.ParameterName = @"@SSN"; 
paramSSN.DbType = DbType.AnsiStringFixedLength; 
paramSSN.Direction = ParameterDirection.Input; 
paramSSN.Value = ssn; 
paramSSN.Size = 11; 
paramSSN.ForceColumnEncryption = true; 
cmd.Parameters.Add(paramSSN); 

SqlDataReader reader = cmd.ExecuteReader();

Настройка доверенных путей для главных ключей столбцовConfiguring Trusted Column Master Key Paths

Метаданные шифрования, возвращаемые SQL Server для параметров запроса, предназначенных для зашифрованных столбцов, и результатов, полученных из зашифрованных столбцов, включают в себя путь к главному ключу столбца, определяющий хранилище ключей и расположение ключа в этом хранилище.The encryption metadata, SQL Server returns for query parameters targeting encrypted columns and for the results retrieved from encryption columns, includes the key path of the column master key that identifies the key store and the location of the key in the key store. Если экземпляр SQL Server скомпрометирован, он может отправить путь к ключу, указывающий на поставщик данных .NET Framework для SQL Server в расположении, контролируемом злоумышленником.If the SQL Server instance is compromised, it could send the key path directing the .NET Framework Data Provider for SQL Server to the location controlled by an attacker. Это может привести к утечке учетных данных хранилища ключей, если оно запрашивает у приложение прохождение проверки подлинности.This may lead to leaking key store credentials, in the case of the key store that requires the application to authenticate.

Для предотвращения подобных атак приложение может задать список доверенных путей для отдельного сервера с помощью свойства SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.To prevent such attacks, the application can specify the list of trusted key paths for a given server using the SqlConnection.ColumnEncryptionTrustedMasterKeyPaths Property. Если поставщик данных платформы.NET для SQL Server получает путь, не входящий в доверенный список, он выдает исключение.If the.NET Framework Data Provider for SQL Server receives a key path outside of the trusted key path list, it will throw an exception.

Несмотря на то, что установка доверенных путей повышает безопасность приложения, вам потребуется изменять код или (и) конфигурацию приложения при каждой смене главного ключа столбца (или при изменении пути к главному ключу столбца).Although setting trusted key paths improves security of your application, you will need to change the code or/and the configuration of the application, whenever you rotate your column master key (whenever the column master key path changes).

В следующем примере показано, как настраивать доверенные пути к главному ключу столбца:The following example shows how to configure trusted column master key paths:

// Configure trusted key paths to protect against fake key paths sent by a compromised SQL Server instance 
// First, create a list of trusted key paths for your server 
List<string> trustedKeyPathList = new List<string>(); 
trustedKeyPathList.Add("CurrentUser/my/425CFBB9DDDD081BB0061534CE6AB06CB5283F5Ea"); 

// Register the trusted key path list for your server 

SqlConnection.ColumnEncryptionTrustedMasterKeyPaths.Add(serverName, trustedKeyPathList);

Копирование зашифрованных данных с помощью SqlBulkCopyCopying Encrypted Data using SqlBulkCopy

С помощью SqlBulkCopy можно скопировать данные, которые уже зашифрованы и хранятся в одной таблице, в другую таблицу, не расшифровывая при этом данные.With SqlBulkCopy, you can copy data, which is already encrypted and stored in one table, to another table, without decrypting the data. Для этого выполните указанные далее действия.To do that:

  • Убедитесь, что конфигурация шифрования целевой таблицы идентична конфигурации исходной таблицы.Make sure the encryption configuration of the target table is identical to the configuration of the source table. В частности, обе таблицы должны иметь одинаковые зашифрованные столбцы, которые должны быть зашифрованы с помощью одних и тех же типов шифрования и ключей шифрования.In particular, both tables must have the same columns encrypted, and the columns must be encrypted using the same encryption types and the same encryption keys. Примечание. Если способ шифрования какого-либо целевого столбца отличается от способа шифрования соответствующего исходного столбца, вы не сможете расшифровать данные в целевой таблице после операции копирования.Note: if any of the target columns is encrypted differently than its corresponding source column, you will not be able to decrypt the data in the target table after the copy operation. Данные будут повреждены.The data will be corrupted.
  • Настройте подключения базы данных к исходной и целевой таблицам без включения постоянного шифрования.Configure both database connections, to the source table and to the target table, without Always Encrypted enabled.
  • Задайте параметр AllowEncryptedValueModifications (см. раздел SqlBulkCopyOptions).Set the AllowEncryptedValueModifications option (see SqlBulkCopyOptions). Примечание. Будьте внимательны при указании параметра AllowEncryptedValueModifications, так как это может привести к повреждению базы данных, поскольку поставщик данных .NET Framework для SQL Server не проверяет необходимость шифрования данных или правильность их шифрования с помощью того же типа шифрования, алгоритма и ключа, как для целевого столбца.Note: Use caution when specifying AllowEncryptedValueModifications as this may lead to corrupting the database because the .NET Framework Data Provider for SQL Server does not check if the data is indeed encrypted, or if it is correctly encrypted using the same encryption type, algorithm and key as the target column.

Параметр AllowEncryptedValueModifications доступен в .NET Framework 4.6.1 и более поздних версиях.The AllowEncryptedValueModifications option is available in .NET Framework 4.6.1 and later versions.

Ниже приведен пример копирования данных из одной таблицы в другую.Here is an example that copies data from one table to another. Предполагается, что столбцы SSN и BirthDate зашифрованы.The SSN and BirthDate columns are assumed to be encrypted.

static public void CopyTablesUsingBulk(string sourceTable, string targetTable)
{
   string sourceConnectionString = "Data Source=server63; Initial Catalog=Clinic; Integrated Security=true";
   string targetConnectionString = "Data Source= server64; Initial Catalog=Clinic; Integrated Security=true";
   using (SqlConnection connSource = new SqlConnection(sourceConnectionString))
   {
      connSource.Open();
      using (SqlCommand cmd = new SqlCommand(string.Format("SELECT [PatientID], [SSN], [FirstName], [LastName], [BirthDate] FROM {0}", sourceTable), connSource))
      {
         using (SqlDataReader reader = cmd.ExecuteReader())
         {
            SqlBulkCopy copy = new SqlBulkCopy(targetConnectionString, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.AllowEncryptedValueModifications);
            copy.EnableStreaming = true;
            copy.DestinationTableName = targetTable;
            copy.WriteToServer(reader);
         }
      }
}

Справочник по API Always EncryptedAlways Encrypted API Reference

Пространство имен: System.Data.SqlClientNamespace: System.Data.SqlClient

Сборка: System.Data (в System.Data.dll)Assembly: System.Data (in System.Data.dll)

ИмяName ОписаниеDescription Версия .NETIntroduced in .NET version
Класс SqlColumnEncryptionCertificateStoreProviderSqlColumnEncryptionCertificateStoreProvider Class Поставщик хранилища ключей для хранилища сертификатов Windows.A key store provider for Windows Certificate Store. 4.64.6
Класс SqlColumnEncryptionCngProviderSqlColumnEncryptionCngProvider Class Поставщик хранилища ключей для интерфейса Microsoft Cryptography API: Next Generation (CNG).A key store provider for Microsoft Cryptography API: Next Generation (CNG). 4.6.14.6.1
Класс SqlColumnEncryptionCspProviderSqlColumnEncryptionCspProvider Class Поставщик хранилища ключей для Microsoft CAPI на основе поставщиков служб шифрования (CSP).A key store provider for Microsoft CAPI based Cryptographic Service Providers (CSP). 4.6.14.6.1
SqlColumnEncryptionKeyStoreProviderSqlColumnEncryptionKeyStoreProvider Class Базовый класс для всех поставщиков хранилища ключей.Base class of the key store providers. 4.64.6
Перечисление SqlCommandColumnEncryptionSettingSqlCommandColumnEncryptionSetting Enumeration Параметры для включения шифрования и расшифровки для подключения к базе данных.Settings to enable encryption and decryption for a database connection. 4.64.6
Перечисление SqlCommandColumnEncryptionSettingSqlConnectionColumnEncryptionSetting Enumeration Параметры для управления поведением постоянного шифрования для отдельных запросов.Settings to control the behavior of Always Encrypted for individual queries. 4.64.6
Свойство SqlConnectionStringBuilder.ColumnEncryptionSettingSqlConnectionStringBuilder.ColumnEncryptionSetting Property Возвращает и задает постоянное шифрование в строке подключения.Gets and sets Always Encrypted in the connection string. 4.64.6
SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled свойствоSqlConnection.ColumnEncryptionQueryMetadataCacheEnabled Property Включает и отключает кэширование метаданных для запроса шифрования.Enables and disables encryption query metadata caching. 4.6.24.6.2
свойства SqlConnection.ColumnEncryptionKeyCacheTtlSqlConnection.ColumnEncryptionKeyCacheTtl Property Возвращает и задает срок жизни для записей в кэше ключа шифрования столбца.Gets and sets time-to-live for entries in the column encryption key cache. 4.6.24.6.2
свойства SqlConnection.ColumnEncryptionTrustedMasterKeyPathsSqlConnection.ColumnEncryptionTrustedMasterKeyPaths Property Позволяет задать список доверенных путей ключа для сервера базы данных.Allows you to set a list of trusted key paths for a database server. Если при обработке запроса приложения драйвер получает путь ключа, которого нет в списке, запрос завершается с ошибкой.If while processing an application query the driver receives a key path that is not on the list, the query will fail. Это свойство обеспечивает дополнительную защиту от атак на систему безопасности, включающих предоставление скомпрометированным SQL Server фиктивных путей ключа, что может привести к утечке учетных данных хранилища ключей.This property provides additional protection against security attacks that involve a compromised SQL Server providing fake key paths, which may lead to leaking key store credentials. 4.64.6
Метод SqlConnection.RegisterColumnEncryptionKeyStoreProvidersSqlConnection.RegisterColumnEncryptionKeyStoreProviders Method Позволяет регистрировать пользовательские поставщики хранилища ключей.Allows you to register custom key store providers. Это словарь, сопоставляющий имена поставщиков хранилища ключей с реализациями поставщиков хранилища ключей.It is a dictionary that maps key store provider names to key store provider implementations. 4.64.6
Конструктор SqlCommand (String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting)SqlCommand Constructor (String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting) Позволяет управлять поведением постоянного шифрования для отдельных запросов.Enables you to control the behavior of Always Encrypted for individual queries. 4.64.6
свойству SqlParameter.ForceColumnEncryptionSqlParameter.ForceColumnEncryption Property Принудительно шифрует параметр.Enforces encryption of a parameter. Если SQL Server сообщает драйверу, что параметр не должен быть зашифрован, запрос, использующий параметр, завершится ошибкой.If SQL Server informs the driver that the parameter does not need to be encrypted, the query using the parameter will fail. Это свойство обеспечивает дополнительную защиту от атак на систему безопасности, включающих предоставление клиенту скомпрометированным SQL Server неверных метаданных шифрования, что может привести к раскрытию данных.This property provides additional protection against security attacks that involve a compromised SQL Server providing incorrect encryption metadata to the client, which may lead to data disclosure. 4.64.6
Новое ключевое слово строки подключения : Column Encryption Setting=enabledNew connection string keyword: Column Encryption Setting=enabled Включает или отключает функцию постоянного шифрования для подключения.Enables or disables Always Encrypted functionality for the connection. 4.64.6

См. также:See Also