Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login

Criptografia de dados no SQL Server

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

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (9)  (0)

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).

Saiba mais sobre SQL Server no guia de referência sobre esse banco de dados

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.

CREATE TABLE Usuario
(
	ID INT IDENTITY,
	[LOGIN] VARCHAR(MAX),
	SENHA VARBINARY (MAX)
)
GO
Listagem 1. Criando a tabela de exemplo

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

01 CREATE MASTER KEY 
02 ENCRYPTION BY PASSWORD = 'PASSWORD@123'
03 GO
04
05 CREATE CERTIFICATE Certificado
06 ENCRYPTION BY PASSWORD = 'SENHA@123'
07 WITH SUBJECT = 'Certificado Senha Usuario'
08 GO
09
10 CREATE SYMMETRIC KEY ChaveSenha
11 WITH ALGORITHM = AES_256
12 ENCRYPTION BY CERTIFICATE Certificado -- 
13 GO
Listagem 2. Criando objetos de criptografia

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.

  01 OPEN SYMMETRIC KEY ChaveSenha
  02 DECRYPTION BY CERTIFICATE Certificado
  03
  04 DECLARE @GUID UNIQUEIDENTIFIER = (SELECT KEY_GUID('ChaveSenha'))
  05 INSERT INTO Usuario VALUES ('FABIO', ENCRYPTBYKEY(@GUID, 'fabio123'))
  06 GO
  07
  08 SELECT    * FROM Usuario
  09
  10 CLOSE SYMMETRIC KEY ChaveSenha
  
Listagem 3. Criptografando dados da tabela

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.


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.

  01 OPEN SYMMETRIC KEY ChaveSenha
  02 DECRYPTION BY CERTIFICATE Certificado
  03 GO
  04
  05 SELECT    *
  06 ,   senhadescriptografada = CAST (DECRYPTBYKEY(SENHA) AS varchar(50))
  07 FROM      Usuario
  08 GO
  09
  10 CLOSE SYMMETRIC KEY ChaveSenha
  
Listagem 4. Descriptografando um campo


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.

Carregando
 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Ajude-nos a evoluir: você gostou do post?  (9)  (0)
Confirmar voto
Compartilhe:
Ficou com alguma dúvida?