Always Encrypted と .NET Framework Data Provider for SQL Server を使用するUsing Always Encrypted with the .NET Framework Data Provider for SQL Server

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database

この記事では、Always Encrypted またはセキュリティで保護されたエンクレーブが設定された Always Encrypted.NET Framework Data Provider for SQL Server を使用して、.NET アプリケーションを開発する方法について説明します。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 または Azure SQL データベースにデータまたは暗号化キーを開示することなく、機密データを暗号化することができます。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 など、Always Encrypted が有効のドライバーは、クライアント アプリケーション内の機密データを透過的に暗号化および暗号化解除することで、この処理を実行します。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 データベースにデータを渡す前にこれらのパラメーターの値を暗号化します。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 を使用するアプリケーションを開発する」を参照してください。For more information, see Develop applications using Always Encrypted with secure enclaves.

前提条件Prerequisites

注意

.NET Framework の特定のバージョンでは、Always Encrypted のサポート レベルが異なります。The level of support for Always Encrypted in particular versions of .NET Framework varies. 詳細については、以下の「Always Encrypted API リファレンス」セクションを参照してください。Please, see the Always Encrypted API reference section below for details.

アプリケーション クエリで Always Encrypted を有効にするEnabling Always Encrypted for Application Queries

パラメーターの暗号化と、暗号化された列をターゲットとするクエリ結果の暗号化解除を有効にする最も簡単な方法としては、Column Encryption Setting 接続文字列キーワードの値を 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.

Always Encrypted を有効にする接続文字列の例を次に示します。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 は、個々のクエリに対しても有効にすることができます。Always Encrypted can also be enabled for individual queries. 以下の「 Always Encrypted のパフォーマンスの影響を制御する 」セクションを参照してください。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:

  • アプリケーションが、データベース内の Always Encrypted キーに関するメタデータへのアクセスに必要な 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 (データベース エンジン)」の「 Permissions (権限)」セクションを参照してください。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.

エンクレーブの計算とエンクレーブの構成証明におけるクライアント ドライバーの役割に関する一般的な情報については、「セキュリティで保護されたエンクレーブが設定された 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. 前のセクションで説明したように、アプリケーション クエリに対して Always Encrypted を有効にします。Enable Always Encrypted for your application queries, as explained in the previous section.

  2. Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet パッケージとお使いのアプリケーションを統合します。Integrate the Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders NuGet package with your application. NuGet はエンクレーブ プロバイダーのライブラリであり、構成証明のプロトコルと、セキュリティで保護されたエンクレーブが設定されたセキュリティで保護されたチャネルを確立するための、クライアント側ロジックが実装されています。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.

  3. アプリケーションの構成を (たとえば、web.config や app.config で) 更新して、データベース用に構成されたエンクレーブ型と、エンクレーブ プロバイダーの間のマッピングを定義します。Update your application configuration (for example in web.config or app.config) to define the mapping between an enclave type, configured for your database, and an enclave provider.

    1. SQL ServerSQL Server とホスト ガーディアン サービス (HGS) を使用している場合は、VBS エンクレーブの型を、NuGet パッケージの Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider クラスにマップする必要があります。If you're using SQL ServerSQL Server and Host Guardian Service (HGS), you need to map the VBS enclave type to the Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider class from the NuGet package.
    2. Azure SQL データベースAzure SQL Database と Microsoft Azure Attestation を使用している場合は、SGX エンクレーブの型を、NuGet パッケージの Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider クラスにマップする必要があります。If you're using Azure SQL データベースAzure SQL Database and Microsoft Azure Attestation, you need to map the SGX enclave type to the Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider class from the NuGet package.

    アプリケーションの構成を編集する方法の詳細については、「チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET Framework アプリケーションの開発」を参照してください。For detailed instructions for how to edit your application configuration, see Tutorial: Develop a .NET Framework application using Always Encrypted with secure enclaves.

  4. データベース接続文字列の Enclave Attestation URL キーワードを、構成証明 URL (構成証明サービス エンドポイント) に設定します。Set the Enclave Attestation URL keyword in your database connection string to an attestation URL (an attestation service endpoint). 構成証明サービス管理者から、ご利用の環境用の構成証明 URL を取得する必要があります。You need to obtain an attestation URL for your environment from your attestation service administrator.

    1. SQL ServerSQL Server とホスト ガーディアン サービス (HGS) を使用している場合は、「HGS 構成証明 URL を確認して共有する」を参照してください。If you're using SQL ServerSQL Server and Host Guardian Service (HGS), see Determine and share the HGS attestation URL.
    2. Azure SQL データベースAzure SQL Database と Microsoft Azure Attestation を使用している場合は、「構成証明ポリシーの構成証明 URL を確認する」を参照してください。If you're using Azure SQL データベースAzure SQL Database and Microsoft Azure Attestation, see Determine the attestation URL for your attestation policy.

詳しいチュートリアルについては、「チュートリアル: セキュリティで保護されたエンクレーブが設定された Always Encrypted を使用する .NET Framework アプリケーションの開発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

アプリケーション クエリに対して Always Encrypted を有効にすると、標準の ADO.NET API (「 ADO.NET でのデータの取得および変更」を参照)、または .NET Framework Data Provider for SQL Server API ( 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 Data Provider for SQL Server は、アプリケーションが必要なデータベース権限を持っており、列マスター キーにアクセスできると仮定して、暗号化された列をターゲットとするすべてのクエリ パラメーターを暗号化し、暗号化された列から取得されたデータを暗号化解除します。これにより、データベース スキーマ内の列用に設定された 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. 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 Data Provider for 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).

次の表は、Always Encrypted が有効かどうかに応じたクエリの動作をまとめたものです。The below table summarizes the behavior of queries, depending on whether Always Encrypted is enabled or not:

クエリの特性Query characteristic Always Encrypted が有効になっており、アプリケーションがキーとキー メタデータにアクセスできる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 が無効になっている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 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 Data Provider for 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 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 (非 Unicode) 文字列に設定され、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. パラメーターの型が Unicode 文字列 (String) に設定された場合、これらは nchar/nvarchar にマップされ、クエリは失敗します。これは、暗号化された nchar/nvarchar 値から暗号化された char/varchar 値への変換が、Always Encrypted でサポートされていないためです。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 列に挿入されるパラメーターのデータ型は、 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 構造体 は datetime の SQL Server データ型にマップされます。By default, DateTime Structure maps to the datetime SQL Server data type. BirthDate 列のデータ型は日付であり、暗号化された datetime 値から暗号化された date 値の変換は Always Encrypted でサポートされていないので、既定のマッピングを使用するとエラーになります。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 句で使用される値は、.NET Framework Data Provider for SQL Server がデータベースに送信する前に透過的に暗号化できるよう、SqlParameter を使用して渡す必要があります。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 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

Always Encrypted が有効になっていない場合でも、暗号化された列をターゲットとするパラメーターがクエリになければ、クエリでは、暗号化された列からデータを取得できます。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:

  • 接続文字列で Always Encrypted が有効になっていないので、クエリは、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).
  • Always Encrypted が無効の状態で、暗号化された列からデータを取得するクエリは、暗号化された列をターゲットとするパラメーターがない場合に限り、パラメーターを含むことができます。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 では、暗号化されたデータ型に対するいくつかの変換がサポートされています。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 プロパティを使用して、特定の SQL Server データ型への .NET データ型の目的のマッピングを適用できます。You can enforce the desired mapping of .NET data types to specific SQL Server data types by using SqlParameter.SqlDbType Property.
  • 10 進数と数値の SQL Server データ型の列をターゲットとするパラメーターの有効桁数と小数点以下桁数が、ターゲット列に対して構成された有効桁数と小数点以下桁数と同じであることを確認する。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.
  • ターゲット列の値を変更するクエリで、datetime2、datetimeoffset、または time の SQL Server データ型の列をターゲットとするパラメーターの有効桁数が、ターゲット列の有効桁数以下であることを確認する。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 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
SqlColumnEncryptionCspProvider クラスSqlColumnEncryptionCspProvider 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. 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.
  • アプリケーションがキー ストア内のキーにアクセスできることを確認します。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.

Azure Key Vault プロバイダーを使用するUsing Azure Key Vault provider

Azure Key Vault は、特にアプリケーションが Azure でホストされている場合、Always Encrypted の列マスター キーの格納と管理に便利なオプションです。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 Key Vault の組み込み列マスター キー ストア プロバイダーは含まれませんが、アプリケーションと容易に統合できる 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. 詳細については、次の情報を参照してください。For details, see:

カスタム列マスター キー ストア プロバイダーを実装する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. ただし、プロバイダーを明示的にインスタンス化して呼び出し、プログラムを使用して Always Encrypted キーをプロビジョニングおよび管理することができます。これにより、(たとえば、一部の列マスター キーの回転として) 暗号化された列暗号化キーを生成したり、列暗号化キーを暗号化解除することができます。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 Key Vault に格納されたキーを使用する場合は、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); 
}

Always Encrypted のパフォーマンスの影響を制御するControlling Performance Impact of Always Encrypted

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 の組み込みのパフォーマンス最適化、および上記の 2 つの要因によるパフォーマンスへの影響を制御する方法について説明します。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) 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 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 を 1 回だけ呼び出します。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 という 2 つの異なるスキーマがあるとします。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 の各テーブルの定義は同じですが、暗号化関連のプロパティは異なります。つまり、s1.t の c という名前の列は暗号化されませんが、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 という 2 人のユーザーが存在します。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 アプリケーションはデータベースへの 2 つの接続を開きます。一方の接続で 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. 2 番目のクエリのクエリ ステートメントが同じであるため、キャッシュに格納されている情報が使用されます。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.

クエリ レベルで Always Encrypted を設定するSetting Always Encrypted at the query level

パラメーター化クエリに対して暗号化メタデータを取得することによるパフォーマンスへの影響を制御するには、Always Encrypted を接続に対して設定する代わりに、個々のクエリに対して有効にします。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:
    • Column Encryption Setting 接続文字列キーワードを [有効] に設定します。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:
    • Column Encryption Setting 接続文字列キーワードを [無効] に設定します。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.

次の例では、データベース接続に対して Always Encrypted が無効になっています。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. ただし、アプリケーションが 2 つの暗号化された列からプレーンテキスト値を受け取ることができるよう、クエリ結果の暗号化解除を有効にする必要があります。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 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. つまり、暗号化された特定の列暗号化キーでは、ドライバーはアプリケーションの有効期間中に 1 回だけキー ストアと交信します。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 Server の追加保護を有効にするEnabling Additional Protection for a Compromised SQL Server

既定では、 .NET Framework Data Provider for SQL Server は、データベースの暗号化対象の列と暗号化の方法に関するメタデータを提供する場合にデータベース システム (SQL Server または Azure SQL データベース) に依存します。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 number 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を呼び出して、SQL Server にクエリ ステートメントを分析し、暗号化する必要があるクエリのパラメーターに関する情報を提供するよう要求します。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 は、サーバーから受信したメタデータにパラメーターを暗号化する必要がないと示されている場合に、例外をスローするようになります。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 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 は、信頼されたキー パス一覧にないキー パスを受信した場合、例外をスローします。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);

SqlBulkCopy を使用して暗号化されたデータをコピーするCopying Encrypted Data using SqlBulkCopy

SqlBulkCopy を使用して、データの暗号化解除を行うことなく、既に暗号化されて 1 つのテーブルに格納されているデータを別のテーブルにコピーできます。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.
  • Always Encrypted を有効にせずに、ソース テーブルとターゲット テーブルへの両方のデータベース接続を構成します。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.

.NET Framework 4.6.1 以降のバージョンでは、AllowEncryptedValueModifications オプションを使用できます。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 Cryptography API: Next Generation (CNG) のキー ストア プロバイダー。A key store provider for Microsoft Cryptography API: Next Generation (CNG). 4.6.14.6.1
SqlColumnEncryptionCspProvider クラスSqlColumnEncryptionCspProvider Class Microsoft CAPI ベースの暗号化サービス プロバイダー (CSP) のキー ストア プロバイダー。A key store provider for Microsoft CAPI based Cryptographic Service Providers (CSP). 4.6.14.6.1
SqlColumnEncryptionKeyStoreProvider クラスSqlColumnEncryptionKeyStoreProvider 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 個々のクエリの Always Encrypted の動作を制御するための設定。Settings to control the behavior of Always Encrypted for individual queries. 4.64.6
SqlConnectionStringBuilder.ColumnEncryptionSetting プロパティSqlConnectionStringBuilder.ColumnEncryptionSetting Property 接続文字列で、Always Encrypted を取得して設定します。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 列暗号化キー キャッシュ内のエントリの有効期間の取得と設定を行います。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 コンストラクター (String、SqlConnection、SqlTransaction、SqlCommandColumnEncryptionSetting)SqlCommand Constructor (String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting) 個々のクエリの Always Encrypted の動作を制御できます。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 接続に対して Always Encrypted 機能を有効または無効にします。Enables or disables Always Encrypted functionality for the connection. 4.64.6

参照See Also