Partilhar via


Usar sempre encriptado com o .NET Framework Data Provider para SQL Server

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada SQL do Azure

Este artigo fornece informações sobre como desenvolver aplicações .NET Framework usando Always Encrypted ou Always Encrypted com enclaves seguros e o Provedor de Dados do .NET Framework para SQL Server (System.Data.SqlClient).

Observação

Não é recomendado usar o .NET Framework Data Provider para SQL Server (System.Data.SqlClient) para novos desenvolvimentos. Para mais informações, consulte System.Data.SqlClient.

O Always Encrypted permite que aplicações clientes encriptem dados sensíveis e nunca revelem os dados ou as chaves de encriptação ao SQL Server ou Azure SQL Database. Um driver habilitado para Always Crypted, como o .NET Framework Data Provider para SQL Server, consegue isto ao encriptar e desencriptar de forma transparente dados sensíveis na aplicação cliente. O driver determina automaticamente quais os parâmetros de consulta que correspondem a colunas sensíveis da base de dados (protegidas com o Always Encrypted) e encripta os valores desses parâmetros antes de passar os dados para o SQL Server ou Azure SQL Database. De forma semelhante, o driver desencripta de forma transparente os dados recuperados das colunas da base de dados encriptadas nos resultados das consultas. Para mais informações, consulte Desenvolver aplicações usando Always Encrypted e Desenvolver aplicações usando Always Encrypted com enclaves seguros.

Observação

O .NET Framework Data Provider para SQL Server (System.Data.SqlClient) não suporta a utilização de enclaves VBS sem atestado.

Pré-requisitos

  • Configure Sempre Encriptado na sua base de dados. Isto envolve o provisionamento de chaves Always Encrypted e a configuração de encriptação para colunas selecionadas da base de dados. Se ainda não tiver uma base de dados com o Always Encrypted configurado, siga as instruções no Tutorial: Como começar com o Always Encrypted.
  • Se estiver a usar Always Encrypted com enclaves seguros, consulte Desenvolver aplicações usando Always Encrypted com enclaves seguros para mais pré-requisitos.
  • Assegure-se de que o .NET Framework versão 4.6.1 ou superior está instalado na sua máquina de desenvolvimento. Para mais detalhes, consulte .NET Framework 4.6. Também precisa de garantir que a versão 4.6 ou superior do .NET Framework está configurada como a versão alvo do .NET Framework no seu ambiente de desenvolvimento. Se estiver a usar o Visual Studio, consulte Como Destinar uma versão do .NET Framework.

Observação

O nível de suporte para o Always Encrypted em versões específicas do .NET Framework varia. As referências da API Always Encrypted estão listadas nas secções seguintes.

Ativar o Always Encrypted para consultas de aplicações

A forma mais fácil de ativar a encriptação dos parâmetros e a desencriptação dos resultados das consultas direcionadas às colunas encriptadas é definir o valor da palavra-chave de string de ligação Column Encryption Setting para ativado.

Segue-se um exemplo de cadeia de ligação que permite o Always Encrypted:

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

Segue-se um exemplo equivalente usando a propriedade SqlConnectionStringBuilder.ColumnEncryptionSetting.

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

O Always Encrypted também pode ser ativado para consultas individuais. Veja abaixo a secção Controlar o impacto no desempenho do Sempre Encriptado . Ativar o Always Encrypted não é suficiente para que a encriptação ou a desencriptação tenham sucesso. Também precisa de garantir que:

  • A aplicação tem as permissões VIEW ANY COLUMN MASTER KEY DEFINITION e VIEW ANY COLUMN ENCRYPTION KEY DEFINITION (definição de chave de criptografia de colunas), necessárias para aceder aos metadados sobre chaves Always Encrypted na base de dados. Para mais detalhes, consulte a secção Permissões em Always Encrypted (Database Engine).
  • A aplicação pode aceder à chave mestra da coluna que protege as chaves de encriptação das colunas, encriptando as colunas da base de dados consultadas.

Ativar o Always Encrypted com enclaves seguros

A partir da versão 4.7.2 do .NET Framework, o driver suporta o Always Encrypted com enclaves seguros.

Para informações gerais sobre o papel do condutor cliente em cálculos e atestação de enclaves, consulte Desenvolver aplicações usando Always Encrypted com enclaves seguros.

Para configurar a sua aplicação:

  1. Ative o Sempre Encriptado para as suas consultas de aplicação, como explicado na secção anterior.

  2. Integre o pacote NuGet Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders com a sua aplicação. O NuGet é uma biblioteca de fornecedores de enclave, que implementa a lógica do lado do cliente para protocolos de atestação e para estabelecer um canal seguro com um enclave seguro.

  3. Atualize a configuração da sua aplicação (por exemplo, em web.config ou app.config) para definir o mapeamento entre um tipo de enclave, configurado para a sua base de dados, e um fornecedor de enclave.

    1. Se estiver a usar SQL Server e Host Guardian Service (HGS), precisa de mapear o tipo de enclave VBS para a classe Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.HostGuardianServiceEnclaveProvider do pacote NuGet.
    2. Se estiveres a usar Azure SQL Database e Microsoft Azure Attestation, precisas de mapear o tipo de enclave SGX para a classe Microsoft.SqlServer.Management.AlwaysEncrypted.EnclaveProviders.AzureAttestationEnclaveProvider do pacote NuGet.

    Para instruções detalhadas sobre como editar a configuração da sua aplicação, consulte Tutorial: Desenvolver uma aplicação .NET Framework usando o Always Encrypted com enclaves seguros.

  4. Defina a Enclave Attestation URL palavra-chave na sua cadeia de conexão à base de dados para um URL de atestação (um endpoint de serviço de atestação). Precisa de obter um URL de atestação para o seu ambiente junto ao administrador do serviço de atestação.

    1. Se estiveres a usar o SQL Server e o Host Guardian Service (HGS), consulta Determinar e partilhar a URL de atestado do HGS.
    2. Se estiver a usar Azure SQL Database e Microsoft Azure Attestation, veja Determinar o URL de atestação para a sua política de atestacionamento.

Para um tutorial passo a passo, veja Tutorial: Desenvolver uma aplicação .NET Framework usando o Always Encrypted com enclaves seguros

Recuperação e modificação de dados em colunas encriptadas

Depois de ativar o Always Encrypted para consultas de aplicação, pode usar APIs ADO.NET padrão (ver Recuperar e Modificar Dados em ADO.NET) ou o Provedor de Dados do .NET Framework para APIs SQL Server , definido no Namespace System.Data.SqlClient, para recuperar ou modificar dados em colunas de base de dados encriptadas. Assumindo que a sua aplicação tem as permissões necessárias para a base de dados e pode aceder à chave mestra da coluna, o .NET Framework Data Provider para SQL Server encriptará quaisquer parâmetros de consulta que visem colunas encriptadas e desencriptará dados recuperados de colunas encriptadas que retornam valores de texto simples dos tipos .NET, correspondentes ao conjunto de tipos de dados SQL Server para as colunas no esquema da base de dados. Se o Always Encrypted não estiver ativado, consultas com parâmetros que visam colunas encriptadas falharão. As consultas ainda podem recuperar dados de colunas encriptadas, desde que a consulta não tenha parâmetros direcionados a colunas encriptadas. No entanto, o .NET Framework Data Provider para SQL Server não tenta desencriptar quaisquer valores recuperados de colunas encriptadas e a aplicação recebe dados encriptados binários (como arrays de bytes).

A tabela abaixo resume o comportamento das consultas, dependendo se o Always Encrypted está ativado ou não:

Característica da consulta O Always Encrypted está ativado e a aplicação pode aceder às chaves e metadados das chaves O Always Encrypted está ativado e a aplicação não consegue aceder às chaves ou aos metadados das chaves O Always Encrypted está desativado
Consultas com parâmetros direcionados a colunas encriptadas. Os valores dos parâmetros são encriptados de forma transparente. Erro Erro
Consultas que recuperam dados de colunas encriptadas, sem parâmetros que visem colunas encriptadas. Os resultados das colunas encriptadas são desencriptados de forma transparente. A aplicação recebe valores em texto simples dos tipos de dados .NET correspondentes aos tipos SQL Server configurados para as colunas encriptadas. Erro Os resultados das colunas encriptadas não são desencriptados. A aplicação recebe valores encriptados como arrays de bytes (byte[]).

Os exemplos seguintes ilustram a recuperação e modificação de dados em colunas encriptadas. Os exemplos assumem a tabela alvo com o esquema abaixo. As colunas SSN e Data de Nascimento estão encriptadas.

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

Exemplo de inserção de dados

Este exemplo insere uma linha na tabela de Pacientes. Tenha em atenção o seguinte:

  • Não há nada específico para encriptação no código de exemplo. O .NET Framework Data Provider para SQL Server deteta e encripta automaticamente os parâmetros paramSSN e paramBirthdate que visam colunas encriptadas. Isto torna a encriptação transparente para a aplicação.
  • Os valores inseridos nas colunas da base de dados, incluindo as colunas encriptadas, são passados como objetos SqlParameter . Embora usar o SqlParameter seja opcional ao enviar valores para colunas não encriptadas (embora seja altamente recomendado porque ajuda a prevenir a injeção SQL), é obrigatório para valores que visam colunas encriptadas. Se os valores inseridos nas colunas SSN ou BirthDate fossem passados como literais incorporados na instrução da consulta, a consulta falharia porque o Provedor de Dados do .NET Framework para SQL Server não conseguiria determinar os valores nas colunas encriptadas de destino, por isso não encriptaria os valores. Como resultado, o servidor rejeitava-as por serem incompatíveis com as colunas encriptadas.
  • O tipo de dado do parâmetro direcionado à coluna SSN é definido para uma cadeia ANSI (não Unicode), que corresponde ao tipo de dados char/varchar SQL Server. Se o tipo do parâmetro fosse definido para uma string Unicode (String), que mapeia para nchar/nvarchar, a consulta falharia, pois o Always Encrypted não suporta conversões de valores nchar/nvarchar encriptados para valores cifrados de char/varchar. Consulte SQL Server Mapeamentos de Tipos de Dados para informações sobre os mapeamentos de tipos de dados.
  • O tipo de dado do parâmetro inserido na coluna Data de Nascimento é explicitamente definido para o tipo de dado alvo do SQL Server usando a Propriedade SqlParameter.SqlDbType, em vez de depender do mapeamento implícito dos tipos .NET para os tipos de dados do SQL Server aplicado ao usar a Propriedade SqlParameter.DbType. Por padrão, a Estrutura DateTime corresponde ao tipo de dado data-hora SQL Server. Como o tipo de dado da coluna Data de Nascimento é data e Sempre Encriptado não suporta a conversão de valores de data-hora encriptados para valores de data encriptados, usar o mapeamento padrão resultaria num erro.
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();
   } 
}

Recuperar dados de texto simples Exemplo

O exemplo seguinte demonstra filtrar dados com base em valores encriptados e recuperar dados de texto simples a partir de colunas encriptadas. Tenha em atenção o seguinte:

  • O valor usado na cláusula WHERE para filtrar na coluna SSN precisa de ser passado usando SqlParameter, para que o .NET Framework Data Provider para SQL Server possa encriptá-lo de forma transparente antes de o enviar para a base de dados.
  • Todos os valores impressos pelo programa estarão em texto simples, pois o .NET Framework Data Provider para SQL Server irá desencriptar de forma transparente os dados recuperados das colunas SSN e Data de Nascimento.

Observação

As consultas podem realizar comparações de igualdade em colunas se estiverem encriptadas usando encriptação determinística. Para mais informações, consulte Seleção de Encriptação Determinística ou Aleatória.

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());
 }

Exemplo de recuperação de dados encriptados

Se o Always Encrypted não estiver ativado, uma consulta ainda pode recuperar dados de colunas encriptadas, desde que a consulta não tenha parâmetros direcionados a colunas encriptadas.

O exemplo seguinte demonstra como recuperar dados binários encriptados de colunas encriptadas. Tenha em atenção o seguinte:

  • Como o Always Encrypted não está ativado na string de ligação, a consulta devolverá valores encriptados de SSN e BirthDate como arrays de bytes (o programa converte os valores em strings).
  • Uma consulta que recupera dados de colunas encriptadas com o modo Sempre Encriptado desativado pode ter parâmetros, desde que nenhum deles tenha como alvo uma coluna encriptada. A consulta acima filtra-se por Apelido, que não está encriptado na base de dados. Se a consulta fosse filtrada por SSN ou Data de Nascimento, a consulta falhava.
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]));
      }
   }
}

Evitar problemas comuns ao consultar colunas encriptadas

Esta secção descreve categorias comuns de erros ao consultar colunas encriptadas de aplicações .NET e algumas orientações sobre como os evitar.

Erros de conversão de tipos de dados não suportados

O Always Encrypted suporta poucas conversões para tipos de dados encriptados. Consulte Sempre Encriptado para uma lista detalhada de conversões de tipos suportadas. Faça o seguinte para evitar erros de conversão de tipos de dados:

  • Defina os tipos de parâmetros direcionados a colunas encriptadas, de modo que o tipo de dado SQL Server do parâmetro seja exatamente igual ao tipo da coluna de destino, ou seja suportada uma conversão do tipo de dados do SQL Server para o tipo de destino da coluna. Pode impor o mapeamento desejado dos tipos de dados .NET para tipos de dados específicos do SQL Server usando a Propriedade SqlParameter.SqlDbType.
  • Verificar que a precisão e escala dos parâmetros que direcionam as colunas dos tipos de dados decimais e numéricos do SQL Server são as mesmas da precisão e escala configuradas para a coluna de destino.
  • Verifique se a precisão dos parâmetros que direcionam as colunas de datetime2, datetimeoffset ou time dos tipos de dados do SQL Server não é maior do que a precisão da coluna de destino (em consultas que modificam valores na coluna de destino).

Erros devido à passagem de texto simples em vez de valores encriptados

Qualquer valor que tenha como alvo uma coluna encriptada precisa de ser encriptado dentro da aplicação. Uma tentativa de inserir/modificar ou filtrar por um valor de texto simples numa coluna encriptada resultará num erro semelhante a este:

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'

Para evitar tais erros, certifique-se:

  • O Always Encrypted está ativado para consultas de aplicação que visam colunas encriptadas (para a string de ligação ou no objeto SqlCommand para uma consulta específica).
  • Usas o SqlParameter para enviar dados direcionados a colunas encriptadas. O exemplo seguinte mostra uma consulta que filtra incorretamente por um literal/constante numa coluna encriptada (número de segurança social - SSN) em vez de passar o literal dentro de um parâmetro SQL.
using (SqlCommand cmd = connection.CreateCommand())
{
   cmd.CommandText = @"SELECT [SSN], [FirstName], [LastName], [BirthDate] FROM [dbo].[Patients] WHERE SSN='795-73-9838'";
cmd.ExecuteNonQuery();
}

Trabalhar com repositórios de Column Master Key

Para encriptar um valor de parâmetro ou desencriptar dados nos resultados das consultas, o Fornecedor de Dados do .NET Framework para SQL Server precisa de obter uma chave de encriptação de coluna configurada para a coluna de destino. As chaves de encriptação das colunas são armazenadas na forma encriptada nos metadados da base de dados. Cada chave de encriptação de coluna tem uma chave mestra correspondente que foi usada para encriptar a chave de encriptação da coluna. Os metadados da base de dados não armazenam as chaves mestras das colunas, e apenas contêm a informação sobre um armazenamento de chaves contendo uma chave mestra de coluna específica e a localização da chave no armazenamento de chaves.

Para obter um valor em texto simples de uma chave de encriptação de coluna, o Fornecedor de Dados do .NET Framework para SQL Server obtém primeiro os metadados tanto sobre a chave de encriptação da coluna como sobre a sua correspondente chave mestra de coluna, e depois usa a informação dos metadados para contactar o armazenamento de chaves que contém a chave mestra da coluna e para desencriptar a chave de encriptação da coluna encriptada. O Fornecedor de Dados .NET Framework para SQL Server comunica com um armazenamento de chaves usando um fornecedor de armazenamento de chaves mestre de coluna – que é uma instância de uma classe derivada da Classe SqlColumnEncryptionKeyStoreProvider.

O processo para obter uma chave de encriptação de coluna:

  1. Se o Always Encrypted estiver ativado para uma consulta, o .NET Framework Data Provider para SQL Server chama transparentemente sys.sp_describe_parameter_encryption para recuperar metadados de encriptação para parâmetros direcionados a colunas encriptadas, caso a consulta tenha parâmetros. Para dados encriptados contidos nos resultados de uma consulta, o SQL Server anexa automaticamente metadados de encriptação. A informação sobre a chave mestra da coluna inclui:

    • O nome de um fornecedor de repositório de chaves que encapsula um repositório de chaves contendo a chave mestra de coluna.
    • O caminho da chave que especifica a localização da chave mestra da coluna no armazenamento de chaves.

    A informação sobre a chave de encriptação da coluna inclui:

    • O valor criptografado de uma chave de criptografia de coluna.
    • O nome do algoritmo usado para encriptar a chave de encriptação da coluna.
  2. O .NET Framework Data Provider para SQL Server utiliza o nome do provedor de armazenamento da chave mestra de coluna para procurar o objeto provedor (uma instância de uma classe derivada da Classe SqlColumnEncryptionKeyStoreProvider) numa estrutura de dados interna.

  3. Para desencriptar a chave de encriptação da coluna, o .NET Framework Data Provider para SQL Server chama SqlColumnEncryptionKeyStoreProvider.DecryptColumnEncryptionKey Method, passando o caminho da chave mestra da coluna, o valor encriptado da chave de encriptação da coluna e o nome do algoritmo de encriptação, usado para produzir a chave de encriptação da coluna encriptada.

Utilização de fornecedores de armazenamento de chaves-mestras de coluna incorporados

O .NET Framework Data Provider para SQL Server inclui os seguintes fornecedores de armazenamento de chaves mestras de coluna incorporados, que estão pré-registados com os respetivos nomes específicos dos fornecedores (usados para consultar o fornecedor).

Class Description Nome do fornecedor (consulta)
Classe SqlColumnEncryptionCertificateStoreProvider Um fornecedor para a Windows Certificate Store. MSSQL_CERTIFICATE_STORE
Classe SqlColumnEncryptionCngProvider

Nota: este fornecedor está disponível no .NET Framework 4.6.1 e versões posteriores.
Um fornecedor para um armazenamento de chaves que suporta a Microsoft Cryptography API: Next Generation (CNG) API. Normalmente, um armazenamento deste tipo é um módulo de segurança de hardware – um dispositivo físico que protege e gere chaves digitais e fornece processamento criptográfico. MSSQL_CNG_STORE
Classe SqlColumnEncryptionCspProvider

Nota: este fornecedor está disponível em .NET Framework 4.6.1 ou versões posteriores.
Um fornecedor para um armazenamento de chaves que suporta a Microsoft Cryptography API (CAPI). Normalmente, um armazenamento deste tipo é um módulo de segurança de hardware – um dispositivo físico que protege e gere chaves digitais e fornece processamento criptográfico. MSSQL_CSP_PROVIDER

Não precisa de fazer alterações no código da aplicação para usar estes fornecedores, mas note o seguinte:

  • Você (ou o seu DBA) precisa garantir que o nome do provedor, configurado nos metadados da chave mestra de coluna, está correto e que o caminho da chave mestra de coluna cumpre o formato de caminho válido para um determinado provedor. Recomenda-se que configure as chaves usando ferramentas como o SQL Server Management Studio, que gera automaticamente os nomes válidos dos fornecedores e caminhos das chaves ao emitir a instrução CREATE COLUMN MASTER KEY (Transact-SQL). Para mais informações, consulte Configurar Sempre Encriptado usando SQL Server Management Studio e Configurar Sempre Encriptado usando PowerShell.
  • Garanta que a sua aplicação pode aceder à chave no armazenamento de chaves. Isto pode envolver conceder à sua aplicação acesso à chave e/ou ao armazenamento de chaves, dependendo do armazenamento de chaves, ou realizar outros passos de configuração específicos do armazenamento de chaves. Por exemplo, para aceder a um armazenamento de chaves que implementa CNG ou CAPI (por exemplo, um módulo de segurança de hardware), é necessário garantir que uma biblioteca que implemente CNG ou CAPI para a sua loja está instalada na sua máquina de aplicação. Para obter detalhes, consulte Criar e armazenar chaves mestras de coluna para Always Encrypted.

Usando o fornecedor Azure Key Vault

O Azure Key Vault é uma opção conveniente para armazenar e gerir chaves mestras de coluna para o Always Encrypted (especialmente se as suas aplicações estiverem alojadas no Azure). O .NET Framework Data Provider para SQL Server não inclui um fornecedor de armazenamento de chaves mestras em coluna incorporado para o Azure Key Vault, mas está disponível como pacote NuGet, que pode facilmente integrar com a sua aplicação. Para obter mais detalhes, consulte:

Implementação de um fornecedor personalizado de armazenamento de chaves mestras de coluna

Se quiser armazenar chaves mestras de coluna numa loja de chaves que não é suportada por um fornecedor existente, pode implementar um fornecedor personalizado estendendo a Classe SqlColumnEncryptionCngProvider e registando o fornecedor usando o método SqlConnection.RegisterColumnEncryptionKeyStoreProviders .

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); 
       // ...
        }

    }

Utilização de provedores de armazenamento de chaves mestras de coluna para o provisionamento programático de chaves

Ao aceder a colunas encriptadas, o .NET Framework Data Provider para SQL Server encontra de forma transparente e chama o provedor de armazenamento de chaves mestras da coluna correto para desencriptar as chaves de encriptação das colunas. Normalmente, o seu código de aplicação normal não chama diretamente os fornecedores de armazenamento de chave mestra de coluna. No entanto, pode instanciar e chamar explicitamente um fornecedor para provisionar e gerir programaticamente chaves Always Encrypted: para gerar uma chave de encriptação de coluna encriptada e desencriptar uma chave de encriptação de coluna (por exemplo, como parte do processo de rotação da chave mestra de coluna). Para mais informações, consulte Visão Geral da gestão de chaves para Always Encrypted. A implementação das suas próprias ferramentas de gestão de chaves pode ser necessária apenas se utilizar um fornecedor de armazenamento de chaves personalizado. Ao usar chaves armazenadas em armazenamentos de chaves, para os quais existem fornecedores incorporados, ou no Azure Key Vault, pode usar ferramentas existentes, como SQL Server Management Studio ou PowerShell, para gerir e provisionar chaves. O exemplo abaixo ilustra a geração de uma chave de encriptação de coluna e a utilização da Classe SqlColumnEncryptionCertificateStoreProvider para encriptar a chave com um certificado.

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

static byte[]  GetEncryptedColumnEncryptionKey()
{
    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); 
}

Controlar o impacto no desempenho do Always Encrypted

Como o Always Encrypted é uma tecnologia de encriptação do lado do cliente, a maior parte dos overheads de desempenho é observada do lado do cliente, não na base de dados. Para além do custo das operações de encriptação e desencriptação, as outras fontes de sobrecarga de desempenho do lado do cliente são:

  • Viagens extra de ida e volta à base de dados para recolher metadados dos parâmetros de consulta.
  • Chamadas a um armazenamento de chave mestra de coluna para aceder à mesma.

Esta secção descreve as otimizações de desempenho incorporadas no .NET Framework Provider para SQL Server e como pode controlar o impacto dos dois fatores acima no desempenho.

Controlo de viagens de ida e volta para recuperar metadados para parâmetros de consulta

Se o Always Encrypted estiver ativado para uma ligação, por padrão, o .NET Framework Data Provider para SQL Server chamará sys.sp_describe_parameter_encryption para cada consulta parametrizada, passando a instrução de consulta (sem quaisquer valores de parâmetro) para o SQL Server. sys.sp_describe_parameter_encryption analisa a instrução de consulta para descobrir se algum parâmetro precisa de ser encriptado e, em caso afirmativo, para cada um desses parâmetros devolve a informação relacionada com a encriptação que permitirá ao Provedor de Dados do .NET Framework para SQL Server encriptar valores de parâmetros. O comportamento acima assegura um elevado nível de transparência para a aplicação do cliente. A aplicação (e o programador da aplicação) não precisa de saber quais consultas acedem às colunas encriptadas, desde que os valores direcionados a colunas encriptadas sejam passados para o Fornecedor de Dados do Framework .NET para SQL Server em objetos SqlParater.

Cache de metadados de consulta

No .NET Framework 4.6.2 e posteriores, o .NET Framework Data Provider para SQL Server armazena em cache os resultados de sys.sp_describe_parameter_encryption para cada instrução de consulta. Assim, se a mesma instrução de consulta for executada várias vezes, o driver chama sys.sp_describe_parameter_encryption apenas uma vez. A cache de metadados de encriptação para instruções de consulta reduz substancialmente o custo de desempenho da obtenção de metadados da base de dados. O cache está ativado por defeito. Pode desativar a cache de metadados de parâmetros definindo a propriedade SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled como falsa, mas isso não é recomendado, exceto em casos raros como o descrito abaixo:

Considere uma base de dados que tem dois esquemas diferentes: s1 e s2. Cada esquema contém uma tabela com o mesmo nome: t. As definições das s1.t tabelas e s2.t são idênticas, exceto propriedades relacionadas com encriptação: Uma coluna, chamada c, em s1.t não está encriptada, e está encriptada em s2.t. A base de dados tem dois utilizadores: u1 e u2. O esquema padrão para os u1 utilizadores é s1. O esquema padrão para u2 é s2. Uma aplicação .NET abre duas ligações à base de dados, imitando o u1 utilizador numa ligação e o u2 utilizador noutra. A aplicação envia uma consulta com um parâmetro direcionado à c coluna sobre a ligação para o utilizador u1 (a consulta não especifica o esquema, pelo que assume-se o esquema padrão do utilizador). Em seguida, a aplicação envia a mesma consulta através da ligação para o u2 utilizador. Se a cache dos metadados da consulta estiver ativada, após a primeira consulta, a cache será preenchida com metadados indicando a c coluna onde os alvos do parâmetro da consulta não estão encriptados. Como a segunda consulta tem a mesma instrução de consulta, a informação armazenada na cache será utilizada. Como resultado, o driver enviará a consulta sem encriptar o parâmetro (o que está incorreto, pois a coluna s2.t.c de destino está encriptada), libertando o valor em texto simples do parâmetro para o servidor. O servidor irá detetar essa incompatibilidade e forçar o driver a atualizar a cache, para que a aplicação reenvie a consulta de forma transparente com o valor do parâmetro corretamente encriptado. Nesse caso, a cache deve ser desativada para evitar a fuga de valores sensíveis para o servidor.

Definição: Sempre Encriptado ao nível da consulta

Para controlar o impacto no desempenho da recuperação de metadados de encriptação para consultas parametrizadas, pode ativar o Always Encrypted em consultas individuais, em vez de configurá-lo para a ligação. Desta forma, pode garantir que sys.sp_describe_parameter_encryption é invocado apenas para consultas que sabe que têm parâmetros direcionados a colunas encriptadas. Note, no entanto, que ao fazê-lo, reduz a transparência da encriptação: se alterar as propriedades de encriptação das colunas da sua base de dados, pode ser necessário alterar o código da sua aplicação para o alinhar com as alterações do esquema.

Observação

Definir Sempre Encriptado ao nível da consulta tem benefícios de desempenho limitados no .NET 4.6.2 e versões posteriores, que implementam cache de metadados de encriptação de parâmetros.

Para controlar o comportamento Always Encrypted de consultas individuais, precisa de usar este construtor de SqlCommand e SqlCommandColumnEncryptionSetting. Aqui ficam algumas orientações úteis:

  • Se a maioria das consultas que uma aplicação cliente envia através de uma ligação à base de dados acede a colunas encriptadas:
    • Defina a palavra-chave da cadeia de conexão Column Encryption Setting para Enabled.
    • Defina o SqlCommandColumnEncryptionSetting.Disabled para consultas individuais que não acedam a nenhuma coluna encriptada. Isto desativará tanto chamar sys.sp_describe_parameter_encryption como tentar desencriptar quaisquer valores no conjunto de resultados.
    • Defina SqlCommandColumnEncryptionSetting.ResultSet para consultas individuais que não tenham parâmetros que exijam encriptação, mas que recuperam dados de colunas encriptadas. Isto irá desativar a chamada para sys.sp_describe_parameter_encryption e a encriptação dos parâmetros. A consulta será capaz de desencriptar os resultados das colunas de encriptação.
  • Se a maioria das consultas que uma aplicação cliente envia através de uma ligação à base de dados não aceder a colunas encriptadas:
    • Defina a palavra-chave da cadeia de ligação Column Encryption Setting para Desabilitada.
    • Defina SqlCommandColumnEncryptionSetting.Enabled para consultas individuais que tenham parâmetros que precisem de ser encriptados. Isto permitirá tanto chamar sys.sp_describe_parameter_encryption como a desencriptação de quaisquer resultados de consulta recuperados de colunas encriptadas.
    • Defina SqlCommandColumnEncryptionSetting.ResultSet para consultas que não tenham quaisquer parâmetros que exijam encriptação, mas que recuperem dados de colunas encriptadas. Isto desativará a chamada à função sys.sp_describe_parameter_encryption e a encriptação de parâmetros. A consulta será capaz de desencriptar os resultados das colunas de encriptação.

No exemplo abaixo, o Always Encrypted está desativado para a ligação à base de dados. A consulta que a aplicação emite tem um parâmetro que direciona a coluna Último Nome que não está encriptada. A consulta recupera dados das colunas SSN e BirthDate que estão ambas encriptadas. Nesse caso, não é necessário chamar sys.sp_describe_parameter_encryption para recuperar metadados de encriptação. No entanto, é necessário ativar a desencriptação dos resultados da consulta, para que a aplicação possa receber valores de texto simples das duas colunas encriptadas. A definição SqlCommandColumnEncryptionSetting.ResultSet é usada para garantir isso.

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());
                  }
               }
            }
  } 
}

Cache de chaves de encriptação de colunas

Para reduzir o número de chamadas para um repositório de chaves mestras de coluna para desencriptar chaves de encriptação de colunas, o .NET Framework Data Provider para SQL Server armazena em cache na memória as chaves de encriptação de colunas em texto claro. Depois de receber o valor da chave de encriptação da coluna encriptada a partir dos metadados da base de dados, o driver tenta primeiro encontrar a chave de encriptação da coluna em texto simples, correspondente ao valor da chave encriptada. O driver chama o armazenamento de chaves que contém a chave mestra da coluna apenas se não conseguir encontrar o valor da chave de encriptação da coluna encriptada na cache.

Observação

No .NET Framework 4.6 e 4.6.1, as entradas da chave de encriptação das colunas na cache nunca são despejadas. Isto significa que, para uma dada chave de encriptação de coluna encriptada, o driver contacta o armazenamento de chaves apenas uma vez durante a vida útil da aplicação.

No .NET Framework 4.6.2 e posteriores, as entradas de cache são despejadas após um intervalo de tempo de vida configurável por razões de segurança. O valor padrão de tempo de vida é de 2 horas. Se tiver requisitos de segurança mais rigorosos sobre o comprimento das chaves de encriptação das colunas que podem ser armazenadas em cache em texto simples na aplicação, pode alterá-los usando a propriedade SqlConnection.ColumnEncryptionKeyCacheTtl.

Permitir proteção extra para um SQL Server comprometido

Por defeito, o Fornecedor de Dados .NET Framework para SQL Server depende do sistema de base de dados (SQL Server ou Azure SQL Database) para fornecer metadados sobre quais colunas da base de dados são encriptadas e como. Os metadados de encriptação permitem ao .NET Framework Data Provider para SQL Server encriptar parâmetros de consulta e desencriptar resultados de consulta sem qualquer intervenção da aplicação, o que reduz significativamente o número de alterações necessárias na aplicação. No entanto, se o processo do SQL Server for comprometido e um atacante alterar os metadados que o SQL Server envia ao Fornecedor de Dados do .NET Framework para o SQL Server, o atacante poderá conseguir roubar informação sensível. Esta secção descreve APIs que ajudam a fornecer um nível extra de proteção contra este tipo de ataque, ao custo de uma transparência reduzida.

Forçar a encriptação dos parâmetros

Antes de o .NET Framework Data Provider for SQL Server enviar uma consulta parametrizada para o SQL Server, pede ao SQL Server ( chamando sys.sp_describe_parameter_encryption) que analise a instrução da consulta e forneça informações sobre quais os parâmetros da consulta que devem ser encriptados. Uma instância SQL Server comprometida pode induzir em erro o Fornecedor de Dados do .NET Framework para SQL Server ao enviar os metadados que indicam que o parâmetro não tem como alvo uma coluna encriptada, mesmo que a coluna esteja encriptada na base de dados. Como resultado, o Fornecedor de Dados do .NET Framework para SQL Server não encriptava o valor do parâmetro e enviava-o como texto simples para a instância comprometida do SQL Server.

Para evitar tal ataque, uma aplicação pode definir a propriedade SqlParameter.ForceColumnEncryption para o parâmetro como true. Isto fará com que o Fornecedor de Dados do Framework .NET para SQL Server lance uma exceção, se os metadados recebidos do servidor indicarem que o parâmetro não precisa de ser encriptado.

Embora a utilização da propriedade SqlParameter.ForceColumnEncryption ajude a melhorar a segurança, também reduz a transparência da encriptação para a aplicação cliente. Se atualizar o esquema da base de dados para alterar o conjunto de colunas encriptadas, poderá ser necessário fazer alterações à aplicação também.

O exemplo de código seguinte ilustra o uso da Propriedade SqlParameter.ForceColumnEncryption para evitar que números de segurança social sejam enviados em texto simples para a base de dados.

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();

Configuração de caminhos de Chave Mestra de Coluna de confiança

Os metadados de encriptação que o SQL Server devolve para parâmetros de consulta direcionados a colunas encriptadas e para os resultados recuperados das colunas de encriptação incluem o caminho da chave mestra da coluna que identifica o armazenamento de chaves e a localização da chave no armazenamento de chaves. Se a instância do SQL Server for comprometida, pode enviar o caminho da chave que direciona o Fornecedor de Dados do Framework .NET para o SQL Server para o local controlado por um atacante. Isto pode levar à divulgação de credenciais do armazenamento de chaves, no caso de um armazenamento de chaves que requer que a aplicação se autentique.

Para prevenir tais ataques, a aplicação pode especificar a lista de caminhos de chave de confiança para um dado servidor usando a propriedade SqlConnection.ColumnEncryptionTrustedMasterKeyPaths. Se the.NET Framework Data Provider para SQL Server receber um caminho de chave fora da lista de caminhos de chaves de confiança, irá lançar uma exceção.

Embora definir caminhos de chave de confiança melhore a segurança da sua aplicação, terá de alterar o código e/ou a configuração da aplicação sempre que rodar a sua chave mestra de coluna (sempre que o caminho da chave mestra da coluna muda).

O exemplo seguinte mostra como configurar caminhos para chaves mestras de colunas confiáveis.

// 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);

Cópia de dados encriptados usando SqlBulkCopy

Com o SqlBulkCopy, pode copiar dados, que já estão encriptados e armazenados numa tabela, para outra tabela, sem ter de desencriptar os dados. Para isso:

  • Certifique-se de que a configuração de encriptação da tabela de destino é idêntica à configuração da tabela de origem. Em particular, ambas as tabelas devem ter as mesmas colunas encriptadas, e as colunas devem ser encriptadas usando os mesmos tipos de encriptação e as mesmas chaves de encriptação. Nota: se alguma das colunas de destino estiver encriptada de forma diferente da correspondente coluna de origem, não será possível desencriptar os dados na tabela de destino após a operação de cópia. Os dados serão corrompidos.
  • Configure ambas as ligações à base de dados, para a tabela de origem e para a tabela de destino, sem o Always Encrypted ativado.
  • Definir a opção AllowEncryptedValueModifications (ver SqlBulkCopyOptions). Nota: Tenha cautela ao especificar AllowEncryptedValueModifications, pois isso pode levar a corromper a base de dados porque o Provedor de Dados do .NET Framework para SQL Server não verifica se os dados estão realmente encriptados, ou se estão corretamente encriptados usando o mesmo tipo de encriptação, algoritmo e chave da coluna de destino.

A opção AllowEncryptedValueModifications está disponível no .NET Framework 4.6.1 e versões posteriores.

Aqui está um exemplo que copia dados de uma tabela para outra. Assume-se que as colunas SSN e Data de Nascimento estão encriptadas.

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);
         }
      }
}

Referência da API sempre criptografada

Namespace:System.Data.SqlClient

Montagem: System.Data (em System.Data.dll)

Nome Description Introduzido na versão .NET
Classe SqlColumnEncryptionCertificateStoreProvider Um fornecedor de armazenamento de chaves para o Armazenamento de Certificados do Windows. 4.6
Classe SqlColumnEncryptionCngProvider Um fornecedor de armazenamento de chaves para a Microsoft Cryptography API: Next Generation (CNG). 4.6.1
Classe SqlColumnEncryptionCspProvider Um fornecedor de repositório de chaves para Provedores de Serviços Criptográficos (CSP) baseados no Microsoft CAPI. 4.6.1
Classe SqlColumnEncryptionKeyStoreProvider Classe base dos fornecedores de armazenamento de chaves. 4.6
Enumeração SqlCommandColumnEncryptionSetting Definições para ativar encriptação e desencriptação para uma ligação a uma base de dados. 4.6
Enumeração de Configuração SqlConnectionColumnEncryptionSetting Definições para controlar o comportamento do Always Encrypted para consultas individuais. 4.6
Propriedade Configuração SqlConnectionStringBuilder.ColumnEncryptionSetting Obtém e define Always Encrypted na cadeia de ligação. 4.6
Propriedade SqlConnection.ColumnEncryptionQueryMetadataCacheEnabled Ativa e desativa o cache de metadados de consultas de encriptação. 4.6.2
Propriedade SqlConnection.ColumnEncryptionKeyCacheTtl Obtém e define o time-to-live para entradas na cache de chave de encriptação da coluna. 4.6.2
Propriedade SqlConnection.ColumnEncryptionTrustedMasterKeyPaths Permite definir uma lista de caminhos de chaves de confiança para um servidor de base de dados. Se, durante o processamento de uma consulta de aplicação, o driver receber um caminho de chave que não está na lista, a consulta falhará. Esta propriedade oferece proteção extra contra ataques de segurança que envolvem um SQL Server comprometido a fornecer caminhos de chave falsos, o que pode levar à fuga de credenciais do armazenamento de chaves. 4.6
Método SqlConnection.RegisterColumnEncryptionKeyStoreProviders Permite registar fornecedores de lojas de chaves personalizadas. É um dicionário que mapeia nomes de fornecedores de armazenamento de chaves para implementações de fornecedores de armazenamento de chaves. 4.6
Construtor SqlCommand (String, SqlConnection, SqlTransaction, SqlCommandColumnEncryptionSetting) Permite-lhe controlar o comportamento do Always Encrypted para consultas individuais. 4.6
Propriedade SqlParameter.ForceColumnEncryption Aplica a encriptação de um parâmetro. Se o SQL Server informar o driver de que o parâmetro não precisa de ser encriptado, a consulta que utiliza o parâmetro falhará. Esta propriedade oferece proteção extra contra ataques de segurança que envolvam um SQL Server comprometido a fornecer metadados de encriptação incorretos ao cliente, o que pode levar à divulgação de dados. 4.6
Nova palavra-chave de string de ligação : Column Encryption Setting=enabled Ativa ou desativa a funcionalidade Always Encrypted para a ligação. 4.6

Consulte também