Criptografia de dados no SQL Server

Veja neste artigo como aumentar a segurança de seus dados no SQL Server por meio da criptografia.

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.

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

      

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

      
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

      
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.

Artigos relacionados