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.
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
Feito isso, vamos agora gerar nossa chave mestra, certificado e chave simétrica, utilizando o código da Listagem 2.
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.
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.
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.
Caso você tente executar esse select sem abrir a chave, o valor NULL será retornado.
OPEN SYMMETRIC KEY ChaveSenha DECRYPTION BY CERTIFICATE Certificado GO SELECT * , senhadescriptografada = CAST (DECRYPTBYKEY(SENHA) AS varchar(50)) FROM Usuario GO CLOSE SYMMETRIC KEY ChaveSenha
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.