Motivação

Durante o desenvolvimento de sistemas, é muito comum que informações sensíveis como CPF, senhas e números de cartão de crédito necessitem de segurança reforçada ao serem armazenados, a fim de garantir a integridade e o sigilo do seu conteúdo. Nesse contexto, para atender a essas demandas geralmente aplicamos técnicas de criptografia, que alteram o conteúdo original, ocultando-o de visitantes não autorizados, e liberando-o apenas para aqueles a quem o acesso é permitido.

No SQL Server, dispomos de recursos que nos auxiliam na criptografia de dados armazenados nas tabelas, bem como na obtenção da informação original após reverter o processo (descriptografia).

Contextualizando: Chaves e Certificados

Para que possamos usar o mecanismo de criptografia do SQL Server, precisamos compreender inicialmente três elementos fundamentais: a chave mestra, o certificado e a chave simétrica/assimétrica, como mostra a Figura 1. Nessa imagem podemos ver também a Database Encryption Key, que é utilizada no TDE (Transparent Data Encryption), processo que serve para criptografar o banco de dados como um todo, por exemplo, durante a realização de backups. Aqui, porém, focaremos na criptografia a nível de coluna.

Objetos de criptografia no SQL Server
Figura 1. Objetos de criptografia no SQL Server

A Master Key é a raiz hierárquica da criptografia do SQL Server, representando uma chave mestra, única para cada banco de dados, que é utilizada para proteger as chaves privadas dos certificados, chaves assimétricas e simétricas. Para criar uma Master Key podemos utilizar o seguinte comando, no qual precisamos obrigatoriamente informar uma senha:


      CREATE MASTER KEY ENCRYPTION
      BY PASSWORD = "senha" --Setando uma senha para a Chave Mestra
      GO
      

O certificado é o segundo objeto dentro da hierarquia de criptografia do SQL Server, e também é responsável por proteger as chaves simétricas e assimétricas. Para criá-lo, é necessário que antes exista uma Master Key, e a ele também devemos adicionar uma senha, que será utilizada para proteger os próximos objetos na hierarquia.

A criação do certificado pode ser feita com o seguinte comando:


      CREATE CERTIFICATE MeuCertificado
      ENCRYPTION BY PASSWORD = "SENHA@123"
      WITH SUBJECT = "Meu Certificado"
      GO
      

Na sequência da hierarquia de objetos relacionados à criptografia no SQL Server, temos a chave simétrica, que é utilizada para criptografar e descriptografar os dados contidos no banco de dados. Ao ser criada, essa chave deve ser criptografada utilizando um certificado, uma senha, outra chave simétrica ou uma chave assimétrica. Além disso, é necessário informar também um algoritmo de criptografia, que define como os dados serão alterados, a fim de se tornarem ilegíveis a pessoas não autorizadas. Para esse parâmetro, as opções disponíveis são: DES, TRIPLE_DES, TRIPLE_DES_3KEY, RC2, RC4, RC4_128, DESX, AES_128, AES_192 e AES_256.

O código abaixo demonstra a criação de uma chave simétrica utilizando o algoritmo AES_256 e criptografia por meio de um certificado:


      CREATE SYMMETRIC KEY MinhaChave
      WITH ALGORITHM = AES_256
      ENCRYPTION BY CERTIFICATE MeuCertificado
      

Montando um ambiente de demonstração

Para compreender, na prática, como funciona a criptografia no SQL Server, vamos utilizar uma tabela que armazenará informações de login e senha de usuários. Para criar essa tabela, execute o script da Listagem 1.

Listagem 1. Criando a tabela de exemplo

CREATE TABLE Usuario
(
   ID INT IDENTITY,
   [LOGIN] VARCHAR(MAX),
   SENHA VARBINARY (MAX)
)
GO

Feito isso, vamos agora gerar nossa chave mestra, certificado e chave simétrica, utilizando o código da Listagem 2.

Listagem 2. Criando objetos de criptografia

 CREATE MASTER KEY 
 ENCRYPTION BY PASSWORD = "PASSWORD@123"
 GO

 CREATE CERTIFICATE Certificado
 ENCRYPTION BY PASSWORD = "SENHA@123"
 WITH SUBJECT = "Certificado Senha Usuario"
 GO

 CREATE SYMMETRIC KEY ChaveSenha
 WITH ALGORITHM = AES_256
 ENCRYPTION BY CERTIFICATE Certificado -- 
 GO
  • Linhas 1 e 2: Criamos a chave mestra, dando a ela uma senha;
  • Linha 5: Geramos o nosso certificado;
  • Linhas 9 a 11: Adicionamos nossa chave simétrica utilizando o algoritmo AES_256 e protegendo-a por meio do certificado criado anteriormente.

Após criarmos nossos objetos de criptografia, podemos consultá-los através das tabelas SYS.symmetric_keys e SYS.certificates, nas quais o SQL Server armazena as informações sobre esses objetos de segurança. Para isso, podemos executar os seguintes comandos:


      SELECT * FROM SYS.symmetric_keys
      GO
      SELECT * FROM SYS.certificates
      GO
      

Aplicando a criptografia na prática

Antes de usar a chave simétrica para criptografar o campo senha da tabela Usuario, devemos abrir essa chave, o que pode ser feito com o comando OPEN SYMMETRIC KEY, no qual também informamos o certificado que foi utilizado ao criar a chave.

Agora, para inserir no campo senha o valor criptografado, devemos utilizar a função ENCRYPTBYKEY, para a qual devemos informar como primeiro parâmetro a GUID da chave que abrimos no comando anterior (ela pode ser obtida com a função KEY_GUID), e o valor do campo.

Execute então o comando da Listagem 3, cujo resultado deverá ser semelhante ao que mostra a Figura 2.

Listagem 3. Criptografando dados da tabela

 OPEN SYMMETRIC KEY ChaveSenha
 DECRYPTION BY CERTIFICATE Certificado

 DECLARE @GUID UNIQUEIDENTIFIER = (SELECT KEY_GUID("ChaveSenha"))
 INSERT INTO Usuario VALUES ("FABIO", ENCRYPTBYKEY(@GUID, "fabio123"))
 GO

 SELECT    * FROM Usuario

 CLOSE SYMMETRIC KEY ChaveSenha
  • Linhas 1 e 2: Abrimos a chave simétrica, disponibilizando-a para uso nas instruções seguintes;
  • Linha 4: Obtemos a GUID (identificador gerado automaticamente pelo SQL Server) da chave;
  • Linha 5: Inserimos o valor criptografado na tabela;
  • Linha 8: Selecionamos os dados da tabela para ver o resultado da operação anterior;
  • Linha 10: Fechamos a chave utilizada.
Tabela Usuario com campo criptografado
Figura 2. Tabela Usuario com campo criptografado

Para descriptografar esses dados e ver o real valor que foi inserido no campo senha, devemos abrir novamente nossa chave simétrica, ler esse campo com a função DECRYPTBYKEY, converter seu valor para varchar e fechar a chave em seguida. A Listagem 4 mostra como isso pode ser feito, enquanto a Figura 3 ilustra o resultado esperado.

Observação:

Caso você tente executar esse select sem abrir a chave, o valor NULL será retornado.

Listagem 4. Descriptografando um campo

 OPEN SYMMETRIC KEY ChaveSenha
 DECRYPTION BY CERTIFICATE Certificado
 GO

 SELECT    *
 ,   senhadescriptografada = CAST (DECRYPTBYKEY(SENHA) AS varchar(50))
 FROM      Usuario
 GO

 CLOSE SYMMETRIC KEY ChaveSenha
Retorno da senha sem criptografia
Figura 3. Retorno da senha sem criptografia

Como vimos, a criptografia no SQL Server é relativamente fácil de configurar e habilitar. No entanto, é importante utilizá-la apenas em colunas nas quais esse recurso de segurança é realmente necessário, pois como toda função do banco de dados, seu uso exige esforços adicionais na realização das operações e pode sobrecarregar o desempenho do banco e da aplicação.