code review sql – Implementación de T-SQL Hmac (Rfc2104 SHA2_256)

Pregunta:

Estoy tratando de implementar un Hmac en T-SQL usando esta pregunta como guía. Por favor critica esto:

create function dbo.Hmac (
    @key varbinary(8000)
  , @message varbinary(7936)
)   
returns table
with schemabinding as
return (
    select HashBytes('SHA2_256', Pads.o + HashBytes('SHA2_256', Pads.i + @message)) as [Hash]
    from (values(
        Cast( -- keys longer than blocksize are shortened and keys shorter than blocksize are zero-padded
            case
                when DataLength(@key) > 64 then HashBytes('SHA2_256', @key)
                else @key
            end
        as binary(64))
      , Cast(0x3636363636363636 as bigint) -- Rfc2104 inner padding constant
      , Cast(0x5C5C5C5C5C5C5C5C as bigint) -- Rfc2104 outer padding constant
    )) as Vars ([key], innerPadding, outerPadding)
    cross apply (values(
      -- unrolled loop to XOR key and iPad
        Cast((Substring(Vars.[key], 1, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 9, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 17, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 25, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 33, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 41, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 49, 8) ^ Vars.innerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 57, 8) ^ Vars.innerPadding) as binary(8))
      -- unrolled loop to XOR key and oPad
      , Cast((Substring(Vars.[key], 1, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 9, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 17, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 25, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 33, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 41, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 49, 8) ^ Vars.outerPadding) as binary(8))
      + Cast((Substring(Vars.[key], 57, 8) ^ Vars.outerPadding) as binary(8))
    )) as Pads (i, o)
);

Respuesta:

Me parece bien, sin saber Transact SQL de todos modos. Algunas cosas a considerar:

  • obviamente, esto implementa solo HMAC-SHA256, por lo que la función debe llamarse de esa manera;
  • los parámetros clave son 8000 valor máximo de varbinary . Eso me parece grande (aunque puede que no importe mucho ya que el tamaño es variable de todos modos);
  • no hay forma de realizar un hash sobre varios campos en la base de datos, lo que podría ser un caso de uso (sin posibilidad de actualización incremental);
  • De manera similar, a menudo se requiere reutilizar la clave para múltiples cálculos, en ese caso puede almacenar en caché los valores de Pads.i y Pads.o

También me faltan algunas constantes que se están introduciendo, pero eso podría deberse a la naturaleza de TSQL .

No olvide probar con los vectores de prueba NIST, solo para estar seguro.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım