O Always Encrypted é um recurso recente que surgiu no sql server 2016 trazendo um novo modelo de criptografia e segurança. Este modelo é capaz de criptografar o banco de forma que somente a aplicação consegue enxergar os dados que estão armazenados na tabela.

O Always encrypted age nas colunas onde cada uma delas recebe um tipo de criptografia diferente, de acordo com o desejo entre as partes e este pode ser: Determinístico e Randômico.

Uma vez implementado o Always encrypted na coluna, basicamente o DBA perde a governança sobre ela, ficando inteiramente manipulável pela aplicação e as chaves são controladas fora do domínio e escopo do DBA.

CRIAÇÃO 

Antes de criar o Always Encrypted, temos de configurar o local de armazenamento para as Column Master Key.  As column master key são as chaves que dão referência para que engine do banco encontre as informações que estão criptografadas em disco.

O engine do banco não armazena as C.M.K (column master key), apenas as Column Encryption Key  que possuem apontadores para suas chaves mestras que as descriptografa quando consultadas.

Nota: podemos ter diversas chaves para  Column Encryption Key e inclusive é uma boa prática para a rotação de chaves, ainda mais, quando usamos a versão On-Premisses.

Abaixo, os quatro tipos de armazenamento que podemos ter para a C.M.K

A C.E.K pode ser de dividida em dois tipos

Modelo Determinístico: onde temos a mesma codificação para valores iguais.
Exemplo: suponha que a coluna cidade tenha o registro Belo Horizonte se repetindo. Para todos os valores Belo Horizonte que aparecerem na coluna, a codificação apresentada no SQL Server será sempre a mesma.

Modelo Randômico: que irá gerar um código mais distinto possível para cada valor contido em uma determinada coluna tornando este modelo mais seguro que o determinístico.

O modelo determinístico tem a vantagem de permitir algumas operações de comparação do tipo: join, lookups, agrupamentos. Ele também modifica as colunas de texto para a collation BIN 2.

Porém, existem algumas restrições quando usamos o modelo randômico, são eles:

  • Não é possível alterar uma coluna e criptografar depois
  • Operações do tipo like, maior que, menor que, joins etc não são possíveis neste modelo
  • O único driver de comunicação que suporta este modelo é o ADO.NET do .NET framework 4.6+
  • A.G e Log shipping são aceitos aqui; Replicação não é suportada
  • Como precisa gerar um código para cada linha, pode impactar na sua performance
  • Colunas indexadas não pode ser criptografadas
  • Trigger referenciando estas colunas irá retornar erro
  • Aumento de espaço em disco e pouco benefício com o uso de compressão

Normalmente, o A.E não causa alteração na aplicação pois é enxergado de forma transparente pelo drive, porém, em algumas, haverá necessidade mudar  a aplicação

Devido a complexidade do processo de criar o A.E via comando T-SQL, o SSMS possui uma interface bastante intuitiva para criação e uso do recurso

Funcionamento:

  1. O cliente faz uma consulta pela aplicação que é enviada ao banco pelo drive de comunicação ADO.NET. (A consulta vai sem criptografia);
  2. O Drive ADO.NET se comunica com o Key Store e através da C.M.K ele criptografa os valores com apontadores para os mesmos dados que estão no disco;
  3. Essa consulta é enviada ao SQL Server e o C.E.K que fica no SQL Server, confere os apontadores e envia para o disco buscando então, os dados armazenados;
  4. A consulta no disco é comparada e quando os valores entre a C.M.K e C.E.K corresponderem, são retornados para o SQL Server retornar para aplicação;
  5. A consulta é enviada criptografada pelo canal de comunicação Aplicação – Banco;
  6. Quando a consulta retorna, o ADO.NET em posse da C.M.K descriptografa esta consulta e retorna para aplicação;
  7. O Cliente então recebe sua consulta decodificada e esta é armazenada na memória;

PARÂMETROS DE CONEXÃO

Para fechar a parte introdutória, embora as colunas que o Always Encrypted criptografa fiquem sob domínio da aplicação onde somente esta pode fazer alterações, é possível visualizar os dados gravados ali, habilitando o seguinte parâmetro de conexão na instância. 

Após habilitar, reinicie a instância e será possível visualizar todo conteúdo das colunas.

Abaixo, na imagem, segue o parâmetro.

Resultado da consulta com o parâmetro de configuração devidamente habilitado:

E assim, fechamos mais um capítulo no assunto segurança, desta vez tradando dos conceitos do Always Encrypted. Finalizo aqui para que o post não fique muito extenso e no próximo, vamos habilitar o mecanismo em ambas as instâncias!

Vejo-os em breve! Fiquem na paz!