Definition
Imagina que tienes una llave de casa que cualquiera podría copiar y usar. Así es esencialmente como funcionan los bearer tokens - si alguien roba tu token, puede hacerse pasar por ti. Los MAC tokens resuelven este problema añadiendo una capa de prueba de que eres el propietario legítimo de ese token.
Con los MAC tokens, no solo muestras tu token para acceder a una API - tienes que demostrar que realmente posees una clave secreta que va con él. Cada vez que haces una petición, creas una firma criptográfica única (llamada Código de Autenticación de Mensaje o MAC) que se calcula usando tu clave secreta, los detalles de tu petición y una marca de tiempo. El servidor verifica esta firma para confirmar dos cosas: que tienes el token real Y que conoces la clave secreta asociada a él.
Esto es importante porque si un hacker intercepta tu petición y ve tu MAC token, no puede simplemente reproducirla o usarla para peticiones diferentes. La firma solo funciona para esa petición específica en ese momento específico. Es como la diferencia entre que alguien fotografíe tu firma (bearer token) versus tener que firmar un nuevo documento en persona cada vez (MAC token). El enfoque de MAC token hace que el robo de tokens sea mucho menos útil para los atacantes porque no pueden usar un token robado para operaciones diferentes.
Example
Los MAC tokens brillan en escenarios de alta seguridad donde los bearer tokens simplemente no son suficientemente seguros. Aquí hay situaciones donde son particularmente valiosos:
Integraciones con APIs Financieras: Cuando una app fintech se conecta a la API de un banco para iniciar transferencias de dinero, los bearer tokens serían arriesgados. Si alguien interceptara un bearer token, podría potencialmente vaciar cuentas. Con MAC tokens, cada petición de transferencia requiere una prueba criptográfica fresca de que la app legítima está haciendo la petición. Incluso si un atacante captura una petición de transferencia en tránsito, no puede modificar la cantidad o el destino porque cambiar cualquier cosa invalida la firma.
Plataformas de Trading: Los sistemas de trading de alta frecuencia que ejecutan órdenes por valor de millones necesitan autenticación a prueba de balas. Un MAC token asegura que una orden de “comprar 10.000 acciones de Apple” no pueda ser manipulada para convertirse en “comprar 10.000 acciones de otra cosa” o reproducida múltiples veces. Cada orden lleva su propia prueba matemática única de autenticidad.
Intercambios de Datos Sanitarios: Cuando los hospitales comparten historiales médicos a través de APIs, las consecuencias de una brecha son severas. Los MAC tokens aseguran que una petición de “resultados del análisis de sangre del paciente Juan García” no pueda ser interceptada y alterada para solicitar los registros de otra persona. La firma bloquea matemáticamente la petición a sus parámetros originales.
Comandos a Dispositivos IoT: Considera una red eléctrica inteligente donde se envían comandos a centrales eléctricas. No querrías que un atacante interceptara un comando de “reducir potencia un 5%” y lo reprodujera cien veces. Los MAC tokens aseguran que cada comando esté firmado de forma única y solo pueda ejecutarse una vez.
Analogía
La Firma Notarizada: Piensa en la diferencia entre firmar un cheque y notarizar un documento. Cualquiera puede falsificar una firma si la ha visto antes (como robar un bearer token). Pero la notarización requiere que te presentes en persona, pruebes tu identidad y que el notario te vea firmar allí mismo. Un MAC token es como notarizar cada petición individualmente - tienes que demostrar, en tiempo real, que realmente eres la persona con autoridad para hacer esa petición.
La Cerradura Desafío-Respuesta: Imagina una cerradura de alta seguridad que no acepta cualquier llave. Cada vez que intentas abrirla, la cerradura muestra un número aleatorio, y debes usar tu calculadora especial (tu clave secreta) para calcular la respuesta correcta. Aunque alguien te vea abrir la puerta una vez, no puede entrar después porque el desafío cambia cada vez. Así funcionan los MAC tokens - la firma incorpora elementos cambiantes (timestamp, nonce) para que no haya dos firmas iguales.
La Receta Secreta del Chef: Imagina un restaurante donde el chef crea una mezcla de condimentos única para cada plato, incorporando el número de mesa del cliente, la hora del pedido y una especia secreta que solo el chef conoce. Cualquier impostor que intentara servir un plato fallaría porque no conoce la especia secreta y no podría recrear la mezcla exacta. Los MAC tokens funcionan de forma similar - sin la clave secreta, no puedes crear firmas válidas.
La Moneda de Desafío Militar: En la tradición militar, los miembros de ciertas unidades llevan monedas de desafío. Cuando te desafían, debes presentar tu moneda. Pero a diferencia de simplemente mostrar una tarjeta de identificación, el ritual de la moneda a menudo implica presentaciones específicas y contraseñas que prueban que no estás simplemente sosteniendo una moneda robada. Los MAC tokens requieren que demuestres conocimiento continuo (la capacidad de generar firmas válidas), no solo posesión de una credencial estática.
Code Example
// Autenticación con MAC Token (concepto)
const crypto = require('crypto');
function createMacSignature(macKey, timestamp, nonce, method, uri, host) {
const normalizedString =
`${timestamp}\n${nonce}\n${method}\n${uri}\n${host}\n`;
return crypto
.createHmac('sha256', macKey)
.update(normalizedString)
.digest('base64');
}
// Petición del cliente con MAC token
const timestamp = Math.floor(Date.now() / 1000);
const nonce = crypto.randomBytes(16).toString('hex');
const mac = createMacSignature(
macKey,
timestamp,
nonce,
'GET',
'/api/resource',
'api.example.com'
);
fetch('https://api.example.com/api/resource', {
headers: {
'Authorization': `MAC id="${tokenId}", ts="${timestamp}", nonce="${nonce}", mac="${mac}"`
}
});
// Verificación en el servidor
function verifyMac(req, macKey) {
const { id, ts, nonce, mac } = parseMacHeader(req.headers.authorization);
const expectedMac = createMacSignature(macKey, ts, nonce, req.method, req.path, req.hostname);
// Verificar frescura del timestamp (prevenir replay)
const age = Date.now() / 1000 - ts;
if (age > 300) return false; // Rechazar si tiene más de 5 minutos
return crypto.timingSafeEqual(Buffer.from(mac), Buffer.from(expectedMac));
}
Diagrama
sequenceDiagram
participant Cliente as Cliente
participant API
Note over Cliente: Tiene token ID + clave secreta MAC
rect rgb(230, 255, 230)
Note over Cliente: MAC Token: La petición está FIRMADA
Cliente->>Cliente: 1. Construir datos de petición:
timestamp + nonce + método + uri + host
Cliente->>Cliente: 2. Calcular firma MAC:
HMAC-SHA256(datos, clave_secreta)
Cliente->>API: 3. Petición + header MAC
Authorization: MAC id="...", ts="...", nonce="...", mac="..."
end
API->>API: 4. Reconstruir MAC esperado
API->>API: 5. Comparar firmas (timing-safe)
API->>API: 6. Verificar frescura del timestamp
API->>Cliente: 7. Respuesta
rect rgb(255, 230, 230)
Note over Cliente,API: Comparación con Bearer Token
Cliente->>API: Bearer: Solo envía el token
Atacante puede reutilizar token robado
end
rect rgb(230, 255, 230)
Note over Cliente,API: Ventaja del MAC Token
Note over API: Cada petición tiene firma única.
Petición robada no puede ser
reproducida ni modificada.
end
Notas de Seguridad
CRÍTICO - …
Configuración y Validación:
- Los MAC tokens proporcionan mejor seguridad que los bearer tokens pero rara vez se usan en la práctica (la especificación de MAC token de OAuth 2.0 nunca se finalizó).
- La clave MAC debe almacenarse de forma segura en el cliente.
- Incluir timestamp en el cálculo del MAC y rechazar peticiones antiguas (ventana de 5-15 minutos) para prevenir ataques de replay.
- Usar nonces criptográficamente aleatorios y rastrear los nonces usados dentro de la ventana de tiempo.
Monitoreo y Protección:
- Usar comparación segura en tiempo para la verificación del MAC.
- Transmitir sobre HTTPS.
- El MAC no encripta el token, solo autentica la petición.
- Considerar alternativas modernas como DPoP (Demonstrating Proof-of-Possession) o mutual TLS para beneficios de seguridad similares con mejor estandarización.