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