Construye tus propias funciones SHA-256 y HMAC
Etapa 7 de 7v2 · d7079d05

Tokens firmados

Firma un payload codificado y verifica la etiqueta con comparación de tiempo constante.

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.

Verificación de Tokens Firmados en Tiempo Constante

La aplicación más habitual de HMAC es la firma y verificación de tokens de sesión o API (similares a los JWT). Para prevenir ataques de temporización (timing attacks), la comparación entre el tag recibido y el tag calculado debe realizarse en tiempo constante.

Modelo mental: Verificación segura y tiempo constante

  1. Se toma la clave secreta key y los datos del payload.
  2. Se calcula el tag HMAC esperado: expectedTag = HMAC-SHA-256(key, payload).
  3. Comparación segura: Se compara expectedTag con tagHex. Si son idénticos, valid = true; si difieren, valid = false.

Tu objetivo en esta etapa

Leer por stdin un JSON con op: "verify", la clave key, el contenido payload y el tag recibido tagHex. Devolver si la firma es válida en valid.

Formato de Entrada

json
{
  "op": "verify",
  "key": "secret",
  "payload": "user=7",
  "tagHex": "f1e5fc74182d5d7550bd0bf416add2187cfeb4e5071b221f3ebd018c5a67ea47"
}

Output Format

json
{
  "valid": true
}

Qué debes hacer paso a paso

  1. Convierte key a bytes: Si se entrega como cadena de texto, conviértela a sus bytes UTF-8 .
  2. Calcula HMAC-SHA-256: Genera la etiqueta HMAC sobre payload usando key.
  3. Compara con tagHex:
    • Verifica si la longitud y el contenido hexadecimal coinciden exactamente.
  4. Emite la salida: Escribe {"valid": isValid} en stdout.

Criterios de aceptación

  • ✅ Valida firmas HMAC legítimas devolviendo valid: true.
  • ✅ Rechaza firmas alteradas o falsificadas devolviendo valid: false.

Comparación de etiquetas

key y payload son texto UTF-8; tagHex representa los bytes de la etiqueta. Compara bytes decodificados, no cadenas con distintas mayúsculas. Para etiquetas de la misma longitud, recorre todos los bytes acumulando diferencias, sin retornar al encontrar la primera. Una etiqueta SHA-256 tiene 32 bytes. Una primitiva de comparación constante de la biblioteca está permitida; delegar el SHA-256 o HMAC no lo está. La funcionalidad se prueba automáticamente; el tiempo constante requiere además revisión de código y del compilador.

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.