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:
1 2 |
-- Retorno: 0x18CAA0AA39B10AE2AB9CFF8DAEC38619F64CF38D SELECT HASHBYTES('SHA1', 'Dirceu Resende') |
Exemplo 2 – MD5:
1 2 |
-- Retorno: 0x48699133C5F20DB0CAB52CC203CFFED1 SELECT HASHBYTES('MD5', 'Dirceu Resende') |
Exemplo 3 – SHA1 com dados de uma tabela:
1 2 3 4 5 6 7 8 9 10 11 |
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!