Hoje em muitas aplicações é essencial o uso de criptografia, para armazenar dados como senha, dados de cartão e até mesmo documentos, entre outros. O SQL Server disponibiliza alguns algoritmos de hashing:

Algoritmo hashing Descrição
SHA1 O Secure Hash Algorithm tem uma função de espelhamento unidirecional desenvolvida pela NSA, cria um valor de 160 bits, com valor arbitrário de mensagem. Esse algoritmo foi baseado no funcionamento do MD4, com algumas melhorias de segurança. Atualmente não se tem conhecimento de nenhum ataque de criptoanálise conhecido contra o SHA1
MD2 O MD2 é um algoritmo de hash que cria um valor de hash de 128 bits, tem funcionamento semelhante ao MD4, foi desenvolvido pela RSA.
MD4 O MD4 é um algoritmo de hash que cria um valor de hash de 128 bits, a sequencia de entrada para o MD4 deve ser comprimento múltiplo de 512 bits.
MD5 O MD5 é um algoritmo de hash de 128 bits, ele substituiu o MD4, por ser unidirecional ele não pode ser transformado no texto que originou o hash.

Os algoritmos de hashing são unidirecionais ou bidirecionais. Os algoritmos bidirecionais permitem criptografar e descriptografar dados. Já os algoritmos unidirecionais permitem somente criptografar, sem a condição de retomar os dados de origem. Chaves simétricas As chaves simétricas utilizam uma única chave para criptografia e para descriptografar, como apenas uma chave é necessária pera criptografar/descriptografar dados, esse tipo de criptografia não é tão forte quanto uma chave assimétrica, porem chaves simétricas oferecem um melhor desempenho para criptografar/descriptografar. Certificados e chaves assimétricas As chaves assimétricas são geradas por um servidor de chaves e não pode fazer backup e nem elas podem ser movidas de um sistema para outro, já os certificados aceitam backup e podem ser restaurados a partir de arquivo, permitindo que você mova bancos de dados criptografados. Criptografia transparente de dados TDE (Transparent Data Encryption) fornece um serviço de criptografia e descriptografia em tempo de execução, assim é possível deixar somente os dados criptografados  no banco de dados. A chave TDE é criptografada com um certificado dentro do banco master, no caso de haver um roubo  do arquivo de backup do seu banco de dados, o conteúdo do banco de dados não poderá ser acessado sem o certificado armazenado no banco master. Gerando hashing de dados


SELECT HASHBYTES('MD5', '123456A'); -- Hasinhg MD5

SELECT HASHBYTES('SHA1', '123456A'); -- Hasing SHA1

Criptografia com chave


DECLARE @chave VARCHAR(80);

SELECT @chave = ENCRYPTBYPASSPHRASE('chaveForteAqui', 'a123456A');

SELECT CAST(DECRYPTBYPASSPHRASE('chaveForteAqui', @chave) AS VARCHAR(MAX));

Declarei uma variavel chamada @chave para armazenar o hash que a função ENCRYPTBYPASSPHRASE gerou, essa função precisa de uma chave(recomendo que utilize uma chave forte) e o segundo parâmetro da função deve ser informado a mensagem a ser criptografada; E na ultima linha descriptografo o hash armazenado na variável, o resultado deve ser: a123456A. Criptografando os dados com uma chave simétrica Primeiro crio uma chave simétrica


CREATE SYMMETRIC KEY testeChaveSimetrica

WITH ALGORITHM = RC4

ENCRYPTION BY PASSWORD = 'ChaveForteAqui';

Em seguida devo abrir minha chave


OPEN SYMMETRIC KEY testeChaveSimetrica

DECRYPTION BY PASSWORD = 'ChaveForteAqui';

Depois utilizo para criptografar/descriptografar os dados

DECLARE @hash VARCHAR(80);

SELECT @hash = ENCRYPTBYKEY(KEY_GUID('testeChaveSimetrica'), 'Texto a ser criptografado')

SELECT CAST(DECRYPTBYKEY(@hash) AS VARCHAR(30));

Primeiro declaro uma variável para armazenar o hash, em seguida criptografo a informação, informado a chave simétrica e a informação a ser criptografada; E por ultimo descriptografo o hash Criando uma chave assimétrica


CREATE ASYMMETRIC KEY chaveAssimetrica

WITH ALGORITHM = RSA_2048

ENCRYPTION BY PASSWORD = 'ChaveForteAqui';

Acima criei uma chave chamada chaveAssimetrica, com o algoritmo RSA_2048(estou utilizando uma algoritmo de 2048 bits, isso perde em desempenho, mas ganha em segurança), existem outros: RSA_512, RSA_1024 e RSA_2048, na maioria dos casos o RSA_512 já estaria de bom tamanho; E como último parâmetro determino uma chave (lembrando que é ideal gerar uma chave forte). Em seguida utilizado a chave assimétrica


DECLARE @hash VARCHAR(MAX);

SELECT @hash = EncryptByAsymKey(AsymKey_ID('chaveAssimetrica'), CONVERT(VARBINARY, 'Informação aqui'));

SELECT CONVERT(VARCHAR, DecryptByAsymKey(AsymKey_ID('chaveAssimetrica'), @hash, N'ChaveForteAqui'));

Vou ficando por aqui nessa primeira parte, na segunda parte desse post pretendo criar um exemplo mais real. Espero que tenham gostado, até mais.