HMAC-SHA256
Combina claves normalizadas con los pads interior y exterior de HMAC.
Constrúyelo en tu lenguaje
El tester trata tu programa como una caja negra: sirve cualquier lenguaje. Estos son los más cómodos para este proyecto.
Autenticación de Mensajes: HMAC-SHA-256
HMAC (Hash-based Message Authentication Code) combina una clave secreta con una función hash (en este caso SHA-256) para garantizar la integridad y autenticidad de un mensaje frente a manipulaciones.
Modelo mental: La fórmula de HMAC
Dado un tamaño de bloque de 64 bytes ():
- Normalización de la clave:
- Si la clave mide más de 64 bytes, se reemplaza por su propio
SHA-256(clave). - Si mide menos de 64 bytes, se rellena con ceros a la derecha hasta completar 64 bytes.
- Si la clave mide más de 64 bytes, se reemplaza por su propio
- Máscaras de relleno internas y externas:
ipad: Byte0x36repetido 64 veces.opad: Byte0x5crepetido 64 veces.- Clave interna:
k_ipad = clave ^ ipad(XOR byte a byte). - Clave externa:
k_opad = clave ^ opad(XOR byte a byte).
- Cálculo de dos pasos:
Tu objetivo en esta etapa
Leer por stdin un JSON con op: "hmac-sha256", la clave secreta en hex keyHex y el mensaje text. Devolver el código HMAC en hex.
Formato de Entrada
{
"op": "hmac-sha256",
"keyHex": "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
"text": "Hi There"
}
Formato de Salida
{
"hex": "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"
}
Qué debes hacer paso a paso
- Normaliza la clave:
- Si la clave en bytes supera 64 bytes, calcula
SHA-256(keyBytes)(32 bytes). - Rellena con ceros a la derecha hasta que la clave tenga exactamente 64 bytes.
- Si la clave en bytes supera 64 bytes, calcula
- Calcula
k_ipadyk_opad:- Para :
k_ipad[i] = key[i] ^ 0x36,k_opad[i] = key[i] ^ 0x5c.
- Para :
- Primer pase (Hash interno):
- Concatena
k_ipadcon los bytes UTF-8 detext. - Calcula
innerHash = SHA-256(k_ipad + text).
- Concatena
- Segundo pase (Hash externo):
- Concatena
k_opadconinnerHash. - Calcula
hmac = SHA-256(k_opad + innerHash).
- Concatena
- Emite la salida: Escribe
{"hex": hmacHex}en stdout.
Criterios de aceptación
- ✅ Cumple la especificación RFC 2104 de HMAC.
- ✅ Produce digests de 64 caracteres hex que coinciden con los vectores de prueba de RFC 4231.
Formato de salida y errores
Los ejemplos multilínea se muestran así para facilitar la lectura. Emite JSON compacto, sin espacios opcionales, con las propiedades en el orden de los ejemplos de salida y un salto de línea final. No escribas logs en stdout. Las pruebas comparan texto exacto.
Para entradas inválidas, usa stderr con la palabra error, stdout vacío y código 1. Para entradas válidas, código 0. Usa números JSON enteros cuando el resultado sea entero.