.NET Framework 데이터 공급자와 Always Encrypted를 사용하여 개발Develop using Always Encrypted with .NET Framework Data Provider

이 항목 적용 대상: 예SQL Server예Azure SQL 데이터베이스없습니다Azure SQL 데이터 웨어하우스 없습니다 병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 문서는 상시 암호화.NET Framework Data Provider for SQL Server를 사용하여 .NET 응용 프로그램을 개발하는 방법에 대한 정보를 제공합니다.This article provides information on how to develop .NET applications using Always Encrypted and the .NET Framework Data Provider for SQL Server.

Always Encrypted를 사용하면 클라이언트 응용 프로그램이 중요한 데이터를 암호화하고 해당 데이터 또는 암호화 키를 SQL Server 또는 Azure SQL Database에 표시하지 않을 수 있습니다.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 Data Provider for 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 또는 Azure SQL Database로 전달하기 전에 이러한 매개 변수의 값을 암호화합니다.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. 자세한 내용은 상시 암호화(데이터베이스 엔진)를 참조하세요.For more information, see Always Encrypted (Database Engine).

필수 구성 요소Prerequisites

  • 데이터베이스에서 상시 암호화를 구성합니다.Configure Always Encrypted in your database. 상시 암호화를 구성하려면 상시 암호화 키를 프로비전하고 선택한 데이터베이스 열에 대한 암호화를 설정해야 합니다.This involves provisioning Always Encrypted keys and setting up encryption for selected database columns. 데이터베이스에 상시 암호화가 구성되지 않은 경우 상시 암호화 시작의 지침을 따르세요.If you do not already have a database with Always Encrypted configured, follow the directions in Getting Started with Always Encrypted.
  • 개발 컴퓨터에 .NET Framework 버전 4.6 이상이 설치되어 있는지 확인합니다.Make sure .NET Framework version 4.6 or higher is installed on your development machine. 자세한 내용은 .NET Framework 4.6을 참조하세요.For details, see .NET Framework 4.6. 또한 개발 환경에서 .NET Framework 버전 4.6 이상이 대상 .NET Framework 버전으로 구성되어 있는지 확인해야 합니다.You also need to make sure .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 are 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

매개 변수 암호화를 설정하고 암호화된 열을 대상으로 하는 쿼리 결과의 암호를 해독하는 가장 쉬운 방법은 열 암호화 설정 연결 문자열 키워드 값을 enabled로 설정하는 것입니다.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 속성을 사용하는 예제입니다.And, 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. 암호화 또는 암호 해독을 위해 상시 암호화를 사용하는 것은 적절하지 않습니다.Note that, enabling Always Encrypted is not sufficient for encryption or decryption to succeed. 다음을 확인해야 합니다.You also need to make sure:

  • 응용 프로그램에는 VIEW ANY COLUMN MASTER KEY DEFINITIONVIEW 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. 자세한 내용은 상시 암호화의 권한 섹션(데이터베이스 엔진)을 참조하세요.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.

암호화된 열에서 데이터 검색 및 수정Retrieving and Modifying Data in Encrypted Columns

응용 프로그램 쿼리에 대해 상시 암호화를 설정하면 System.Data.SqlClient Namespace에 정의된 표준 ADO.NET API( ADO.NET에서 데이터 검색 및 수정 참조) 또는 .NET Framework Data Provider for SQL ServerAPI를 사용하여 암호화된 데이터베이스 열에서 데이터를 검색하거나 수정할 수 있습니다.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. 응용 프로그램에 필요한 데이터베이스 권한이 있고 열 마스터 키에 액세스할 수 있는 경우 데이터베이스 스키마의 열에 설정된 SQL Server 데이터 형식에 따라 .NET Framework Data Provider for SQL Server에서 암호화된 열을 대상으로 하는 쿼리 매개 변수를 암호화하고 .NET 형식의 일반 텍스트 값을 반환하는 암호화된 열에서 검색된 데이터의 암호를 해독합니다.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. 상시 암호화를 사용하지 않는 경우 암호화된 열을 대상으로 하는 매개 변수가 있는 쿼리가 실패합니다.If Always Encrypted is not 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 Data Provider for SQL Server는 암호화된 열에서 검색된 값을 해독하지 않고 응용 프로그램에서 암호화된 이진 데이터(바이트 배열)를 수신합니다.However, the .NET Framework Data Provider for SQL Server will not 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 is enabled and application cannot 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. 응용 프로그램에서 암호화된 열에 대해 구성된 SQL Server 형식에 해당하는 .NET 데이터 형식의 일반 텍스트 값을 수신합니다.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 are not 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 열은 암호화되어 있습니다.Note that 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 Data Provider for SQL Server에서는 암호화된 열을 대상으로 하는 paramSSNparamBirthdate 매개 변수를 자동으로 검색하고 암호화합니다.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 is highly recommended because it helps prevent SQL injection), it is required for values targeting encrypted columns. SSN 또는 BirthDate 열에 삽입된 값이 쿼리 문에 포함된 리터럴로 전달된 경우 .NET Framework Data Provider for 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)로 설정되어 nchar/nvarchar에 매핑되는 경우 상시 암호화가 암호화된 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 does not 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 열에 삽입되는 매개 변수의 데이터 형식은 SqlParameter.DbType 속성을 사용할 때 적용되는 SQL Server 데이터 형식으로 .NET 형식을 암시적으로 매핑하지 않고 SqlParameter.SqlDbType 속성을 사용하여 명시적으로 대상 SQL Server 데이터 형식으로 설정됩니다.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 구조체 는 SQL Server 데이터 형식 datetime에 매핑됩니다.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:

  • SSN 열에서 필터링하기 위해 WHERE 절에 사용된 값을 SqlParameter를 사용하여 전달해야 합니다. 그러므로 .NET Framework Data Provider for 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 Data Provider for 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 the Selecting Deterministic or Randomized encryption section of Always Encrypted (Database Engine).

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 및 BirthDate의 암호화된 값을 바이트 배열로 반환합니다(프로그램에서 값을 문자열로 변환).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 is not 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 (Database Engine) 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 Data Provider for 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 Data Provider for 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 Data Provider for 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 Data Provider for 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 Data Provider for 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 Data Provider for 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 Data Provider for 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).

클래스Class 설명Description 공급자 (조회) 이름Provider (lookup) name
SqlColumnEncryptionCertificateStoreProvider 클래스SqlColumnEncryptionCertificateStoreProvider Class Windows 인증서 저장소에 대한 공급자입니다.A provider for Windows Certificate Store. MSSQL_CERTIFICATE_STOREMSSQL_CERTIFICATE_STORE
SqlColumnEncryptionCngProvider 클래스SqlColumnEncryptionCngProvider Class

참고: 이 공급자는 .NET Framework 4.6.1 이상 버전에서 사용할 수 있습니다.Note: this provider is available in .NET Framework 4.6.1 and later versions.
Microsoft 암호화 API: 차세대(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
SqlColumnEncryptionCspProvider 클래스SqlColumnEncryptionCspProvider Class

참고: 이 공급자는 .NET Framework 4.6.1 이상 버전에서 사용할 수 있습니다.Note: this provider is available in .NET Framework 4.6.1 or later versions.
Microsoft CAPI(암호화 API)를 지원하는 키 저장소 공급자입니다.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:

  • 사용자 또는 DBA는 열 마스터 키 메타데이터에 구성된 공급자 이름이 정확하고 열 마스터 키 경로가 특정 공급자에 대해 적합한 키 경로 형식을 준수해야 합니다.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. CREATE COLUMN MASTER KEY(Transact-SQL) 문을 실행할 때 적합한 공급자 이름 및 키 경로를 자동으로 생성하는 SQL Server Management Studio 등의 도구를 사용하여 키를 구성하는 것이 좋습니다.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. 자세한 내용은 SQL Server Management Studio를 사용하여 Always Encrypted 구성PowerShell을 사용하여 Always Encrypted 구성을 참조하세요.For more information, see Configuring Always Encrypted using SQL Server Management Studio and Configure Always Encrypted using PowerShell.
  • 응용 프로그램에서 키 저장소의 키에 액세스할 수 있어야 합니다.You need to 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. 자세한 내용은 열 마스터 키 만들기 및 저장(상시 암호화)를 참조하세요.For details, see Create and Store Column Master Keys (Always Encrypted).

Azure Key Vault 공급자 사용Using 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 Data Provider for 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 Data Provider for 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). 자세한 내용은 상시 암호화를 위한 키 관리 개요를 참조하세요.For more information, see Overview of Key Management for Always Encrypted. 사용자 지정 키 저장소 공급자를 사용하는 경우에만 고유한 키 관리 도구를 구현해야 합니다.Note that 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 Provider for 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 Data Provider for 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 Data Provider for 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. 응용 프로그램(및 응용 프로그램 개발자)에서는 암호화된 열을 대상으로 하는 값이 SqlParameter 개체의 .NET Framework Data Provider for SQL Server에 전달되는 한 어떤 쿼리가 암호화된 열에 액세스하는지 유의하지 않아도 됩니다.The application (and the application developer) does not 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 Data Provider for 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 is not recommended except in very 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. 응용 프로그램은 사용자 u1에 대한 연결을 통해 c열을 대상으로 하는 매개 변수가 포함된 쿼리를 보냅니다(쿼리에서 스키마를 지정하지 않으면 기본 사용자 스키마로 가정).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 동작을 제어하려면 SqlCommandSqlCommandColumnEncryptionSetting의 이 생성자를 사용해야 합니다.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 need 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 Data Provider for 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 이상 버전에서 캐시 항목은 보안상의 이유로 구성 가능한 TTL(Time-to-Live) 시간 간격 후 제거됩니다.In .NET Framework 4.6.2 and later, the cache entries are evicted after a configurable time-to-live interval for security reasons. 기본 TTL(Time-to-Live) 값은 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 Server에 대한 추가 보호를 사용하도록 설정Enabling Additional Protection for a Compromised SQL Server

기본적으로 .NET Framework Data Provider for SQL Server 는 데이터베이스 시스템(SQL Server 또는 Azure SQL Database)을 사용하여 데이터베이스의 어떤 열을 어떻게 암호화할지 고려하여 메타데이터를 제공합니다.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 Data Provider for 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 amount of changes required in the application. 그러나 SQL Server 프로세스가 손상되고, SQL Server가 .NET Framework Data Provider for 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 Data Provider for 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 Data Provider for 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 Data Provider for 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 Data Provider for SQL Server에서는 예외를 throw합니다.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 속성 을 사용하면 보안이 강화되지만 클라이언트 응용 프로그램에 대한 암호화 투명도는 줄어듭니다.Note that 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 Data Provider for 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 Framework Data Provider for SQL Server에서 신뢰할 수 있는 키 경로 목록 외부에 있는 키 경로를 수신하면 예외가 throw됩니다.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.

신뢰할 수 있는 키 경로를 설정하면 응용 프로그램 보안이 개선되지만 열 마스터 키를 이동할 때마다 즉 열 마스터 키 경로가 변경될 때마다 응용 프로그램 코드 및/또는 구성을 변경해야 합니다.Note that 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);

SqlBulkCopy를 사용하여 암호화된 데이터 복사Copying 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 Data Provider for 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 이상 버전에서 사용할 수 있습니다.Note that 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);
         }
      }
}

Always Encrypted API 참조Always Encrypted API Reference

네임스페이스: System.Data.SqlClientNamespace: System.Data.SqlClient

어셈블리: System.Data(System.Data.dll에서)Assembly: System.Data (in System.Data.dll)

이름Name 설명Description 도입된 .NET 버전Introduced in .NET version
SqlColumnEncryptionCertificateStoreProvider 클래스SqlColumnEncryptionCertificateStoreProvider Class Windows 인증서 저장소에 대한 키 저장소 공급자입니다.A key store provider for Windows Certificate Store. 4.64.6
SqlColumnEncryptionCngProvider 클래스SqlColumnEncryptionCngProvider Class Microsoft 암호화 API: 차세대(CNG)에 대한 키 저장소 공급자입니다.A key store provider for Microsoft Cryptography API: Next Generation (CNG). 4.6.14.6.1
SqlColumnEncryptionCspProvider 클래스SqlColumnEncryptionCspProvider Class CSP(암호화 서비스 공급자)를 기반으로 하는 Microsoft CAPI에 대한 키 저장소 공급자입니다.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
SqlCommandColumnEncryptionSetting 열거형SqlCommandColumnEncryptionSetting Enumeration 데이터베이스 연결에 대한 암호화 및 암호 해독을 활성화하는 설정입니다.Settings to enable encryption and decryption for a database connection. 4.64.6
SqlConnectionColumnEncryptionSetting 열거형SqlConnectionColumnEncryptionSetting Enumeration 개별 쿼리에 대한 상시 암호화의 동작을 제어하는 설정입니다.Settings to control the behavior of Always Encrypted for individual queries. 4.64.6
SqlConnectionStringBuilder.ColumnEncryptionSetting 속성SqlConnectionStringBuilder.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.ColumnEncryptionKeyCacheTtl 속성SqlConnection.ColumnEncryptionKeyCacheTtl Property 열 암호화 키 캐시에서 항목에 대한 TTL(Time-to-Live)을 가져와 설정합니다.Gets and sets time-to-live for entries in the column encryption key cache. 4.6.24.6.2
SqlConnection.ColumnEncryptionTrustedMasterKeyPaths 속성SqlConnection.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.RegisterColumnEncryptionKeyStoreProviders 메서드SqlConnection.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 생성자(문자열, 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.ForceColumnEncryption 속성SqlParameter.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