Volver |

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