Hashing
Generar hash de un campo binario en SQL Server
En SQL Server existe una función llamada HASHBYTES que permite generar un hash de una columna de tipo varbinary.
HASHBYTES ( '<algorithm>', { @input | 'input' } ) <algorithm>::= MD2 | MD4 | MD5 | SHA | SHA1 | SHA2_256 | SHA2_512
Por ejemplo:
SELECT HASHBYTES ('SHA2_512', foto_nro_serie) FROM datos;
Antes del SQL Server 2016, esta función solo permitía hasta 8000 bytes, por lo que se puede tomar los primeros 8000 bytes y generar un hash con eso:
SELECT HASHBYTES ('SHA2_512', LEFT(foto_nro_serie, 8000))
Función hmac en SQL Server.
Una función hmac es una función que genera un hash con una clave secreta. Esto permite validar la integridad de los datos. Por ejemplo, una función en SQL Server que hace esto es:
CREATE FUNCTION [dbo].[firmar](
@datos VARBINARY(MAX),
@clave VARCHAR(100) = NULL)
RETURNS VARBINARY(128)
AS
BEGIN
DECLARE @hmac VARBINARY(128) = NULL;
SET @hmac = (SELECT HASHBYTES ('SHA2_512', CONCAT(LEFT(@datos, 7900), CONVERT(VARBINARY(100), @clave))));
RETURN @hmac;
END
Luego, para validar que la firma es correcta, se puede volver a firmar y comparar con el hmac generado anteriormente:
DECLARE @datos AS VARBINARY(MAX) = NULL;
DECLARE @clave AS VARCHAR(80) = NULL;
DECLARE @resultado_esperado AS VARBINARY(128) = NULL;
DECLARE @resultado_real AS VARBINARY(128) = NULL;
SET @datos = ...;
SET @clave = 'clave';
SET @resultado_esperado = dbo.firmar(@datos, @clave);
SET @resultado_real = ...;
IF @resultado_esperado = @resultado_real
BEGIN
SELECT 'TRUE'
END
ELSE
BEGIN
SELECT 'FALSE'
END
En este artículo participaron:
No hay autores registrados