Criptografia no SQL Server 2005

O SQL Server 2005 ganhou novos recursos para criptografia de dados, melhorando a capacidade de proteção dos dados.

Para que seja realizada a criptografia de dados é necessário criar chaves para criptografia. Essas chaves ficarão armazenadas dentro do banco de dados.

As chaves de criptografia precisarão elas próprias estarem criptografadas. A criptografia de uma chave pode ser feita por um certificado digital, que também é criado e armazenado na base de dados, ou por meio de uma senha que é atribuida a cada chave.

O uso de um certificado para a criptografia das chaves evita a necessidade de atribuir uma senha para cada chave, funciona como uma forma de agrupamento de chaves.

O certificado pode ser um certificado digital auto-gerado pelo SQL Server ou um certificado digital importado de outra origem para o SQL Server. Você pode, por exemplo, importar um certificado digital gerado por uma entidade certificadora.

O certificado digital auto-gerado também precisa ser criptografado. Podemos fazer isso atribuindo uma senha para o certificado digital ou utilizando a masterKey do banco de dados para criptografar o certificado digital.

Esta estrutura hierárquica (masterKey->Certificado->Chaves) gera maior segurança para a base de dados, fazendo com que uma única senha, a senha da masterKey, tenha o controle sobre toda a criptografia.

Para compreender melhor toda essa estrutura, vamos testar, passo a passo, a criptografia do nome do produto (productName) da tabela products do NorthWind.

1o Passo : Criar a master key com uma senha

CREATE MASTER KEY ENCRYPTION BY PASSWORD = '23987hxJ#KL95234nl0zBe';

2o Passo : Criar o certificado digital

CREATE CERTIFICATE Produtos
WITH SUBJECT = 'CertificadoProdutos'

Sem o uso da masterKey seria necessário atribuir uma senha

3o Passo : Criar a chave

create symmetric key sk_produtos with algorithm = Triple_DES encryption
by certificate produtos;

Da mesma forma, sem o uso do certificado seria necessário incluir uma senha

 

4o Passo : Incluir uma coluna para a criptografia

alter table products add ProductEnc varbinary(300)

Estamos trabalhando com uma alteração de dados existentes. Observe que a coluna que irá receber os dados criptografados precisa ser do tipo VarBinary.

5o Passo : Abrir a chave

Para criptografar e descriptografar precisamos fazer o que é chamado de "Abrir" a chave de criptografia.

Open Symmetric key sk_Produtos decryption by certificate produtos

Se tivessemos utilizado uma senha, sempre que utilizassemos o Open teriamos que indicar a senha. Sua senha acabaria ficando espalhada através das aplicações.

6o Passo : Criptografar os dados

Update products set productEnc=encryptbykey(key_guid('sk_produtos'),productname)

Neste ponto é feita a atualização da nova coluna aplicando-se a função encryptbykey.

Existe ainda uma opção de aumentar ainda mais a segurança fazendo o vinculo da informação criptografada com um campo da tabela, em geral a chave primária.

É feito então o calculo de um hash e adicionado aos dados criptografados. Para que a descriptografia seja feita corretamente, o mesmo valor deverá ser informado no momento da descriptografia. Com isso a informação criptografada fica sempre ligada ao registro, precisando ser informado o ID do registro para que a descriptografia seja realizada.

Veja a criptografia com o autenticador :

Update products set productEnc=encryptbykey(key_guid('sk_produtos'),productname,1,productid)

7o Passo : Teste o resultado

select * from products

Você verá os dados em binário, criptografados.

8o Passo : Teste a descriptografia

select productid,
convert(nvarchar, decryptbykey(productenc)) as Produto
from products

Neste exemplo utilizamos a função decryptbykey para descriptografar as informações.

Observe que é necessário converter a informação de volta para o seu tipo de dados original para que seja legível. No nosso exemplo, nvarchar.

Caso tivessemos utilizado uma chave adicional, como citei anteriormente, teríamos que novamente utiliza-la na descriptografia.

Veja a descriptografia com o autenticador :

select productid,
convert(nvarchar, decryptbykey(productenc,1,productid)) as Produto
from products

9o Passo : Crie uma view e simplifique tudo

Para evitar a necessidade de abrir a chave de criptografia, podemos utilizar a função decryptbykeyautocert em uma view. Esta função irá fazer a abertura da chave de criptografia automaticamente - ou retornar um valor alternativo caso não consiga.

create view Produtos
as
select productid,
convert(nvarchar, decryptbykeyautocert(cert_id('produtos'),null,productenc)) as Produto
from products

Observe o valor alternativo que foi indicado - null - este valor será exibido caso o usuário não possa por algum motivo acessar o certificado de produtos.

 

Atribuindo Acesso

Experimente criar um usuário novo, com permissão de leitura na base de dados. Faça um select na view e verá que este usuário não consegue visualizar os dados.

Atribua permissões a este usuário para acessar a chave de criptografia e o certificado. O usuário passará imediatamente a visualizar os dados.

Veja um passo a passo para isso :

Na aba security, crie um novo login UsuarioTeste utilizando sql server authentication

artigo08082006-01.gif

Em User Mappings, ligue o usuário com o banco Northwind, role db_datareader

artigo08082006-02.gif

Clique no botão change connection (toolbox superior, a esquerda) e se conecte como UsuarioTeste

artigo08082006-03.gif

Faça um Select na view Produtos

artigo08082006-04.gif

Na aba security do banco northwind, clique em propriedades do UsuarioTeste

artigo08082006-05.gif

Clique em securables, Add, Specific Objects

artigo08082006-06.gif

Clique em object Types e selecione Symmetric Keys e Certificates

artigo08082006-07.gif

Clique em browse e selecione os 2 objetos que irão aparecer, Produtos e sk_Produtos

 

artigo08082006-08.gif

Defina as permissões em cada um como control, references e view definitions

 

artigo08082006-09.gif

 

Faça novamente o select na view produtos, desta vez o usuário conseguirá visualizar os dados.

artigo08082006-10.gif 

 

Conclusão

Com estes recursos você pode criptografar dados críticos em sua base de dados, tal como valores de salários e números de cartões de crédito e determinar, através das permissões nas chaves e certificados, quem poderá fazer a descriptografia.