Olá pessoal,
Tudo em paz ?

Um pouco sobre codificação
Neste post irei demonstrar um pouco mais sobre a função HASHBYTES do SQL Server, que permite trabalhar com funções criptográficas baseadas em HASH, onde uma vez codificado, não é possível obter a string original novamente. Caso você queira saber mais sobre criptografia utilizando o algoritmo Base64, que permite codificar e decodificar uma string, acesse aqui.

A validação da string codificada se dá por meio de comparação, codificando novamente a string a ser testada e comparando o HASH recém gerado com o HASH original. Caso os HASH’s coincidam, a string testada é confirmada como verdadeira.

Essa forma de validação é considerada mais segura que a criptogrifia, uma vez que a complexidade da codificação é muito maior e dificulta ataques hackers para quebrar a string codificada. Embora seja um método bem seguro, já foi comprovada a existência de colisões, que são duas ou mais strings que geram um mesmo HASH, fazendo com que a sua segurança seja quebrada por uma string que diferente da original. A medida que a aumentamos a quantidade de bits da nossa criptografia, mais segura ela fica e demanda mais processamento para quebrá-la (e mais espaço para armazenar os HASH’s)

Nível de criptografia dos algoritmos:

  • 128 bits (16 bytes): MD2, MD4 e MD5
  • 160 bits (20 bytes): SHA e SHA1
  • 256 bits (32 bytes): SHA2_256 (SQL Server 2012 em diante)
  • 512 bits (64 bytes): SHA2_512 (SQL Server 2012 em diante)

A função HASHBYTES
Vamos colocar em prática tudo o que foi falado acima. Mãos à obra! A função de sistema HASHBYTES retorna o hash de MD2, MD4, MD5, SHA1 ou SHA2 (SQL Server 2012 em diante) de sua entrada no SQL Server.

Exemplo 1 – SHA1:

-- Retorno: 0x18CAA0AA39B10AE2AB9CFF8DAEC38619F64CF38D
SELECT HASHBYTES('SHA1', 'Dirceu Resende')

Exemplo 2 – MD5:

-- Retorno: 0x48699133C5F20DB0CAB52CC203CFFED1
SELECT HASHBYTES('MD5', 'Dirceu Resende')

Exemplo 3 – SHA1 com dados de uma tabela:

IF(OBJECT_ID('tempdb..#Teste') IS NOT NULL) DROP TABLE #Teste
CREATE TABLE #Teste (Ds_Texto nvarchar(50))
INSERT #Teste VALUES ('Dirceu Resende'), ('SQL Server');

SELECT HASHBYTES('SHA1', Ds_Texto) FROM #Teste

/*
-- Retorno:
0xA76690CCD5AF74518E9C6218B4CBC6BA313C86E6
0xD983D8A96DAA8A7368438848B6D988FC4AA6659B
*/

Até a próxima!