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
- Se toma la clave secreta
keyy los datos delpayload. - Se calcula el tag HMAC esperado:
expectedTag = HMAC-SHA-256(key, payload). - Comparación segura: Se compara
expectedTagcontagHex. 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
{
"op": "verify",
"key": "secret",
"payload": "user=7",
"tagHex": "f1e5fc74182d5d7550bd0bf416add2187cfeb4e5071b221f3ebd018c5a67ea47"
}
Output Format
{
"valid": true
}
Qué debes hacer paso a paso
- Convierte
keya bytes: Si se entrega como cadena de texto, conviértela a sus bytes UTF-8 . - Calcula HMAC-SHA-256: Genera la etiqueta HMAC sobre
payloadusandokey. - Compara con
tagHex:- Verifica si la longitud y el contenido hexadecimal coinciden exactamente.
- 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.