HASHBYTES y para qué se usa?
HASHBYTES es una función criptográfica que toma una cadena de texto o un valor binario y devuelve un valor hash (o digest) que representa la entrada de manera compacta. Los valores hash son secuencias de longitud fija, únicas para cada entrada distinta, y tienen la propiedad de ser difíciles de revertir. HASHBYTES se utiliza comúnmente en los siguientes escenarios:
HASHBYTES
HASHBYTES ( 'algoritmo', input )
algoritmo: Especifica el algoritmo de hash que se utilizará. Los valores permitidos son:
'MD2'
'MD4'
'MD5'
'SHA' (equivalente a SHA-1)
'SHA1'
'SHA2_256' (SHA-256)
'SHA2_512' (SHA-512)
input: La cadena de texto o valor binario que se desea convertir en un hash. Puede ser de tipo nvarchar, varchar o varbinary.
HASHBYTES
Supongamos que tienes una cadena y deseas calcular su hash usando el algoritmo MD5:
SELECT HASHBYTES('MD5', 'Hola Mundo') AS HashMD5;
Resultado:
HashMD5
---------------------------------
0x68E109F0F40CA72A15E05CC22786F8E6
El valor 0x68E109F0F40CA72A15E05CC22786F8E6 es el hash MD5 en formato hexadecimal para la cadena 'Hola Mundo'.
Si necesitas un hash más seguro, puedes utilizar SHA2_256:
SELECT HASHBYTES('SHA2_256', 'ContraseñaSegura') AS HashSHA256;
Resultado:
HashSHA256
-----------------------------------------
0x6AA9D6D06CD7D4AF8B1D726295B6BA6470F097D7081B2C24BA1A841E65B9AF8E
El resultado es un hash de 256 bits, que es más seguro y largo que el hash MD5.
Supongamos que tienes una tabla Usuarios con las columnas UsuarioID y Contraseña, y deseas almacenar las contraseñas como hashes usando SHA2_256:
UPDATE Usuarios
SET Contraseña = CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', Contraseña));
Esto convierte las contraseñas existentes en hashes de 64 caracteres (SHA-256) y los actualiza en la tabla Usuarios.
Si tienes dos valores y deseas verificar si son idénticos:
DECLARE @Cadena1 NVARCHAR(100) = 'Hola Mundo';
DECLARE @Cadena2 NVARCHAR(100) = 'Hola Mundo!';
IF HASHBYTES('SHA2_256', @Cadena1) = HASHBYTES('SHA2_256', @Cadena2)
PRINT 'Las cadenas son iguales';
ELSE
PRINT 'Las cadenas son diferentes';
El resultado será 'Las cadenas son diferentes' porque los valores hash generados para cada cadena serán distintos.
Puedes combinar varias columnas de una fila y calcular un hash que represente la fila completa. Esto es útil para detectar cambios en los datos:
SELECT HASHBYTES('SHA2_256', CONCAT(Nombre, Apellido, Telefono)) AS HashFila
FROM Empleados;
Esto genera un hash único para cada combinación de Nombre, Apellido y Telefono.
El valor que devuelve HASHBYTES es de tipo VARBINARY, por lo que se almacena mejor en columnas VARBINARY. Por ejemplo:
CREATE TABLE Contraseñas (
UsuarioID INT PRIMARY KEY,
HashContraseña VARBINARY(64)
);
INSERT INTO Contraseñas (UsuarioID, HashContraseña)
VALUES (1, HASHBYTES('SHA2_512', 'Contraseña123'));
Esto inserta un hash de 512 bits para la contraseña 'Contraseña123'.
Si deseas comparar contraseñas de texto plano con los hashes almacenados, utiliza HASHBYTES en la cláusula WHERE:
SELECT UsuarioID
FROM Contraseñas
WHERE HashContraseña = HASHBYTES('SHA2_512', 'Contraseña123');
Esto busca registros en los que el valor hash de 'Contraseña123' coincida con el hash almacenado en la columna HashContraseña.
MD2, MD4, MD5 y SHA (SHA-1) se consideran inseguros para aplicaciones criptográficas debido a vulnerabilidades conocidas. Se recomienda utilizar algoritmos más seguros como SHA2_256 o SHA2_512.
HASHBYTES devuelve NULL si se usa con cadenas de más de 8000 bytes para tipos de datos varchar o nvarchar. En estos casos, se sugiere utilizar conversiones a varbinary.
HASHBYTES es de tipo VARBINARY, por lo que para mostrarlo como texto, se debe convertir a VARCHAR si se necesita un formato legible.
SELECT CONVERT(VARCHAR(64), HASHBYTES('SHA2_256', 'Texto'));
HASHBYTES para comparar directamente contraseñas de texto plano. En su lugar, utiliza técnicas de "salting" y "hashing" seguras para mejorar la protección de contraseñas.
Para más información sobre HASHBYTES, consulta la documentación oficial de Microsoft.
Jorge García
Fullstack developer