Criptografia de dados no SQL Server – Criptografia Simétrica e Assimétrica
04/07/2011 Deixe um comentário
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.
- 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.
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]
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).