Olá, caros leitores! Hoje abordaremos um assunto delicado, que é a criptografia de dados no SQL Server.
O SQL Server 2005/2008 suporta nativamente a maioria dos métodos de criptografia, como criptografia simétrica, criptografia assimétrica, uso de certificados e TDE – Criptografia Transparente de Dados.
O SQL Server criptografa os dados usando um sistema de criptografia hierárquica, significa que cada camada criptografa a camada mais abaixo, e infraestrutura de gerenciamento de chaves.
Para ver o gráfico que foi fornecido pela Technet para ilustrar a Hierarquia de criptografia, clique aqui.
Vejamos em detalhes os métodos de criptografia simétrica e criptografia assimétrica.
Criptografia simétrica
A criptografia simétrica é o método mais antigo e conhecido na computação, utiliza a mesma chave para criptografar e para descriptografar os dados contidos em nosso banco de dados.
É o método mais recomendado para rotinas no banco de dados, e consegue unir uma boa performance na recuperação de dados e uma segurança adequada para a maioria dos casos.
Para criar uma chave simétrica no SQL Server 2005/2008, use o código abaixo:
CREATE SYMMETRIC KEY NomeDaChave [ AUTHORIZATION nome_usuario] WITH ALGORITHM = AlgoritimoDeCriptografia
ENCRYPTION BY {CERTIFICATE NomeCertificado | PASSWORD = SenhaForte | SYMMETRIC KEY NomeDaChave | ASYMMETRIC KEY NomeDaChave}
O comando acima cria uma nova chave simétrica no SQL Server, vamos entender melhor o que cada argumento faz.
NomeDaChave
Nome da chave simétrica no banco de dados, esse nome é exclusivo, você pode criar uma chave temporária usando o prefixo #NomeDaChave.
AUTHORIZATION nome_usuario
Especifica o nome do usuário do banco de dados ou função de aplicativo que possuirá essa chave, esse argumento é opcional.
ALGORITHM = AlgoritimoDeCriptografia
Você deve informar ao comando CREATE qual algoritmo de criptografia ele deve usar, existem as seguintes opções: DES | TRIPLE_DES | TRIPLE_DES_3KEY | RC2 | RC4 | RC4_128 | DESX | AES_128 | AES_192 | AES_256
Existem duas observações importantes no MSDN que devem ser levadas em consideração para a escolha do algoritmo:
Reprovação do algoritmo RC4.
O uso repetido do mesmo RC4 ou RC4_128 KEY_GUID em blocos de dados diferentes resultam na mesma chave RC4 porque o SQL Server não fornece um salt automaticamente. O uso da mesma chave RC4 repetidamente é um erro bem conhecido que resulta em criptografia muito fraca. Portanto, preterimos as palavras-chave RC4 e RC4_128. Esse recurso será removido em uma versão futura do Microsoft SQL Server. Não utilize esse recurso em desenvolvimentos novos e modifique, assim que possível, os aplicativos que atualmente o utilizam.
Esclarecimento em relação aos algoritmos DES:
- O DESX foi nomeado incorretamente. As chaves simétricas criadas com ALGORITHM = DESX na verdade usam a cifra TRIPLE DES com uma chave de 192 bits. O algoritmo DESX não é fornecido. Esse recurso será removido em uma versão futura do Microsoft SQL Server. Evite usar esse recurso em desenvolvimentos novos e planeje modificar os aplicativos que atualmente o utilizam.
- As chaves simétricas criadas com ALGORITHM = TRIPLE_DES_3KEY usam TRIPLE DES com uma chave de 192 bits.
- As chaves simétricas criadas com ALGORITHM = TRIPLE_DES usam TRIPLE DES com uma chave de 128 bits.
Fonte: MSDN
ENCRYPTION BY {CERTIFICATE | PASSWORD | SYMMETRIC KEY | ASYMMETRIC KEY}
Quando uma chave simétrica é criada, ela deve ser criptografada usando um dos métodos citados na sintaxe, veja a diferença de cada um.
CERTIFICATE
Especifica o nome do certificado que será usado para criptografar a chave simétrica. O certificado já deve existir no banco de dados.
PASSWORD
Especifica uma senha para criptografar a chave, essa senha deve ser compatível com as diretivas de senha do Windows. Use sempre uma senha forte para criptografar uma chave simétrica.
SYMMETRIC KEY
Você deve especificar o nome de uma chave simétrica já existente no banco de dados, essa chave será usada para criptografar a chave que está sendo criada.
ASYMMETRIC KEY
Você deve especificar o nome de uma chave simétrica já existente no banco de dados, essa chave será usada para criptografar a chave que está sendo criada.
Criptografia simétrica na prática
1 – Crie um novo banco de dados chamado CriptografiaNoSqlServer, fique à vontade para escolher o nome que quiser.
CREATE DATABASE [CriptografiaNoSqlServer]
2 – Vamos criar uma nova tabela chamada CadastroDePessoas, segue o código:
CREATE TABLE [dbo].[CadastroDePessoas](
[Codigo] [int] IDENTITY(1,1) NOT NULL,
[NomeCompleto] [nvarchar](50) NOT NULL,
[RG] [varbinary](MAX) NOT NULL,
[CPF] [varbinary](MAX) NOT NULL,
[Login] [varbinary](MAX) NOT NULL,
[Senha] [nvarchar](50) NOT NULL,
[Ativo] [bit] NOT NULL,
CONSTRAINT [PK_CadastroDePessoas] PRIMARY KEY CLUSTERED
(
[Codigo] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[CadastroDePessoas] ADD CONSTRAINT [DF_CadastroDePessoas_Ativo] DEFAULT ((0)) FOR [Ativo]
GO
Veja que nossa tabela tem os campos RG, CPF e Login como varbinary, isso é feito para guardar os dados criptografados no formato binário.
Para criar uma chave simétrica, você deve escolher como ela será criptografada, o SQL Server trabalha com hierarquia de criptografia, então a chave simétrica também é criptografada.
Criando uma nova chave simétrica chamada ChaveSimetrica01 e usando uma senha para criptografá-la:
CREATE SYMMETRIC KEY ChaveSimetrica01 WITH ALGORITHM = TRIPLE_DES_3KEY ENCRYPTION BY PASSWORD = N'xF0F1F2'
Para saber se sua chave foi criada com sucesso, use o seguinte comando:
SELECT * FROM sys.symmetric_keys
3 – Agora vamos incluir uma pessoa em nossa tabela.
/**
ABRIMOS A CHAVE SIMÉTRICA ANTES DE USAR
*/
OPEN SYMMETRIC KEY ChaveSimetrica01 DECRYPTION BY PASSWORD = N'xF0F1F2';
/*
INCLUIMOS OS DADOS NA TABELA
*/
INSERT INTO [CadastroDePessoas]([NomeCompleto], [RG], [CPF], [Login], [Senha], [Ativo])
VALUES('Diogo Luiz',
EncryptByKey(Key_GUID('ChaveSimetrica01'), CONVERT(VARBINARY, N'00.000.000-0')) ,
EncryptByKey(Key_GUID('ChaveSimetrica01'), CONVERT(VARBINARY, N'000.000.000-00')) ,
EncryptByKey(Key_GUID('ChaveSimetrica01'), CONVERT(VARBINARY, N'diogoluiz')) ,
N'40bd001563085fc35165329ea1ff5c5ecbdbbeef', 1);
Agora que incluímos uma pessoa, vamos ver como os campos que foram criptografados ficaram.
SELECT RG, CPF, [Login] FROM dbo.CadastroDePessoas
Veja que usamos dois comandos na inclusão de dados, o comando EncryptByKey trabalha juntamente com a função Key_GUID.
A função EncryptByKey é responsável por criptografar os dados inseridos e para fazer isso ela pede como primeiro parâmetro uma chave simétrica. Para selecionar a chave, usamos Key_GUID(‘NomeDaChave‘), então passamos o texto que será encriptado. O texto que será encriptado pode ser dos seguintes tipos: nvarchar, char, varchar, binary, varbinary e nchar.
Existem mais parâmetros que podem ser usados em EncryptByKey, se quiser saber mais veja a documentação no MSDN.
4 – Recuperando os dados.
Para que possamos usar dados da nossa tabela, precisamos descriptografar as colunas. Para fazer isso, primeiro usamos OPEN SYMMETRIC KEY para abrir nossa chave simétrica e a função DecryptByKey descriptografa a coluna usando essa chave, veja um exemplo.
OPEN SYMMETRIC KEY ChaveSimetrica01 DECRYPTION BY PASSWORD = N'xF0F1F2';
GO
SELECT CONVERT(VARCHAR, DECRYPTBYKEY(RG)) AS RG,
CONVERT(VARCHAR, DECRYPTBYKEY(CPF)) AS CPF,
CONVERT(VARCHAR, DECRYPTBYKEY([Login])) AS [Login] FROM dbo.CadastroDePessoas
Criptografia assimétrica
O método de criptografia assimétrica ou criptografia de chave pública trabalha de forma bem mais segura que a criptografia simétrica, mas perde em desempenho. O método de chave pública utiliza um par de chaves, uma chave para criptografar (chave pública) e outra para descriptografar (chave privada), além de utilizar algoritmos bem mais
chegando a 2048 bits.
A criptografia assimétrica é indicada na proteção de dados muito sensíveis como números de cartão de crédito, documentos confidenciais etc…
A maneira usada para criar e utilizar chaves assimétricas é muito semelhante a maneira já apresentada na criação de chaves simétricas.
Vamos criar uma nova chave assimétrica:
CREATE ASYMMETRIC KEY NomeDaChave [ AUTHORIZATION nome_usuario]
WITH ALGORITHM = AlgoritimoDeCriptografia ENCRYPTION BY PASSWORD = SenhaForte
NomeDaChave
Nome da chave assimétrica no banco de dados, esse nome é exclusivo, você pode criar uma chave temporária usando o prefixo #NomeDaChave.
AUTHORIZATION nome_usuario
Especifica o nome do usuário do banco de dados ou função de aplicativo que possuirá essa chave, esse argumento é opcional.
ALGORITHM = AlgoritimoDeCriptografia
Você deve informar ao comando CREATE qual algoritmo de criptografia ele deve usar, existem as seguintes opções: { RSA_512 | RSA_1024 | RSA_2048 }
PASSWORD = ‘SenhaForte‘
Especifica uma senha para criptografar a chave particular, essa senha deve ser compatível com as diretivas de senha do Windows.
Caso você omita esse parâmetro, o SQL Server vai usar a chave mestra para criptografar a chave particular.
Criptografia assimétrica na prática
1 – Criando uma chave assimétrica.
CREATE ASYMMETRIC KEY ChaveAssimetrica001
WITH ALGORITHM = RSA_2048
ENCRYPTION BY PASSWORD = N'xF0F1F2';
GO
Para verificar se a chave foi criada corretamente, use:
SELECT * FROM sys.asymmetric_keys
Agora incluiremos uma nova pessoa, usando a mesma tabela gerada no exemplo anterior.
INSERT INTO [CadastroDePessoas]([NomeCompleto], [RG], [CPF], [Login], [Senha], [Ativo])
VALUES('Fabiano Costa',
EncryptByAsymKey(AsymKey_ID('ChaveAssimetrica001'), CONVERT(VARBINARY, '11.111.111-1')) ,
EncryptByAsymKey(AsymKey_ID('ChaveAssimetrica001'), CONVERT(VARBINARY, '111.111.111-11')) ,
EncryptByAsymKey(AsymKey_ID('ChaveAssimetrica001'), CONVERT(VARBINARY, 'fabiano')) ,
'40bd001563085fc35165329ea1ff5c5ecbdbbeef', 1);
Veja que não é preciso abrir a chave assimétrica antes de usá-la.
2 – Recuperando os dados.
SELECT CONVERT(VARCHAR, DecryptByAsymKey(AsymKey_ID('ChaveAssimetrica001'), RG, N'xF0F1F2')) AS RG,
CONVERT(VARCHAR, DecryptByAsymKey(AsymKey_ID('ChaveAssimetrica001'), CPF, N'xF0F1F2')) AS CPF,
CONVERT(VARCHAR, DecryptByAsymKey(AsymKey_ID('ChaveAssimetrica001'), [Login], N'xF0F1F2')) AS [Login]
FROM dbo.CadastroDePessoas WHERE NomeCompleto = N'Fabiano Costa'
Para descriptografar as informações, usamos a função DecryptByAsymKey junto com AsymKey_ID.
A função DecryptByAsymKey utiliza três parâmetros no exemplo:
- O primeiro deve ser o ID da chave assimétrica no banco de dados e para selecionar esse ID usamos a função AsymKey_ID(‘NomeDaChave’);
- O segundo parâmetro deve ser o texto ou campo da tabela;
- O terceiro parâmetro é a senha da chave assimétrica. Caso você omita esse parâmetro, o SQL Server vai usar a chave mestra do banco para descriptografar a chave particular.
Agora que já conhecemos o básico sobre criptografia e como usá-la diretamente no SQL Server, podemos criar STORED PROCEDURES e VIEWS para criptografar e descriptografar os dados automaticamente. Esse recurso é muito valioso e devemos usá-lo sempre que existirem dados sigilosos em nosso banco de dados.
Por enquanto é só. Até a próxima!