Hola, chicos,
¿Todos en paz?

Un poco sobre codificación
En este post demostraré un poco más sobre la función HASHBYTES de SQL Server, que permite trabajar con funciones criptográficas basadas en HASH, donde una vez codificadas no es posible volver a obtener la cadena original. Si desea saber más sobre el cifrado utilizando el algoritmo Base64, que le permite codificar y decodificar una cadena, accede aquí.

La validación de la cadena codificada se realiza mediante comparación, recodificando la cadena que se va a probar y comparando el HASH recién generado con el HASH original. Si el HASH coincide, se confirma que la cadena probada es verdadera.

Esta forma de validación se considera más segura que la criptografía, ya que la complejidad de la codificación es mucho mayor y dificulta que los ataques de piratas informáticos rompan la cadena codificada. Si bien es un método muy seguro, ya se ha comprobado la existencia de colisiones, que son dos o más cadenas que generan el mismo HASH, provocando que su seguridad se vea rota por una cadena diferente a la original. A medida que aumentamos la cantidad de bits en nuestro cifrado, más seguro se vuelve y requiere más procesamiento para romperlo (y más espacio para almacenar los HASH).

Nivel de cifrado del algoritmo:

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

La función HASHBYTES
Pongamos en práctica todo lo dicho anteriormente. ¡Empezar a trabajar! La función del sistema HASHBYTES devuelve el hash MD2, MD4, MD5, SHA1 o SHA2 (SQL Server 2012 en adelante) de su entrada de SQL Server.

Ejemplo 1 – SHA1:

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

Ejemplo 2 – MD5:

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

Ejemplo 3 – SHA1 con datos de una tabla:

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
*/

¡Hasta la próxima!