Criptografia de dados no SQL Server – Criptografia Simétrica e Assimétrica

Olá caros leitores, hoje vou abordar 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 a 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 infra-estrutura de gerenciamento de chaves.

Clique aqui e veja o gráfico que foi fornecido pela Technet para ilustrar a Hierarquia de criptografia.

Nesse primeiro artigo vou abordar 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, esse método utiliza a mesma chave para criptografar e descriptografar os dados contidos em nosso banco de dados.

É o método mais recomendado para rotinas no banco de dados, a criptografia simétrica 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 algorítimo 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 algorítimo, veja abaixo.

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

Vou criar uma nova chave simétrica chamada ChaveSimetrica01 e usar uma senha para criptografa-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 estou usando dois comandos em nossa 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.

Exitem 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 algorítimos bem mais potentes 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 algorítimo 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 vou incluir uma nova pessoa,  para fazer isso vou usa 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 de 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 existir dados sigilosos em nosso banco de dados.

Por enquanto é só, na próxima matéria vou abordar a criação da chave mestra e o uso de certificados para substituir o uso de senhas (como é recomendado pela Microsoft).

Deixe um comentário