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
Em User Mappings, ligue o usuário com o banco Northwind, role db_datareader
Clique no botão change connection (toolbox superior, a esquerda) e se conecte como UsuarioTeste
Faça um Select na view Produtos
Na aba security do banco northwind, clique em propriedades do UsuarioTeste
Clique em securables, Add, Specific Objects
Clique em object Types e selecione Symmetric Keys e Certificates
Clique em browse e selecione os 2 objetos que irão aparecer, Produtos e sk_Produtos
Defina as permissões em cada um como control, references e view definitions
Faça novamente o select na view produtos, desta vez o usuário conseguirá visualizar os dados.
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.