DAT (Distributed Access Token)


Por qué nació DAT

Hoy en día muchos sistemas adoptan JWT, pero en los entornos reales de producción existen las siguientes limitaciones estructurales.
Para resolverlas se diseñó DAT, una nueva especificación de token.

🧩 Fragmentación de la especificación de seguridad y falta de obligatoriedad

JWT ofrece estándares de cifrado como JWE, pero su uso no es obligatorio.
Por ello, en muchos entornos de desarrollo se omite el cifrado o se transmiten los datos mediante métodos no estándar, lo que genera vulnerabilidades de seguridad.

🔑 Riesgo de seguridad por el uso de claves fijas (Static Key)

La rotación de las claves de firma (Key Rolling) no es obligatoria, por lo que es frecuente utilizar una única clave durante largos períodos. Esto puede conducir al colapso de la seguridad de todo el sistema si la clave se ve comprometida y, de hecho, ya se han producido incidentes de este tipo en grandes sitios de comercio electrónico.

📉 Degradación del rendimiento por la sobrecarga

JWT realiza un proceso de análisis JSON en cada solicitud y consume recursos de CPU considerables. En entornos que exigen alto rendimiento, este coste de análisis puede convertirse en el cuello de botella global del sistema.


La filosofía central de DAT

DAT se diseñó bajo el principio de que la seguridad no debe ser opcional sino obligatoria, y de que el rendimiento no es negociable.

⚡ Ligero y rápido

expire
uint64 (decimal)
.
cid
uint64 (hexadecimal)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
Pase el cursor sobre cada campo para ver su descripción.

Tal como se muestra arriba, DAT solo tiene cinco campos fijos separados por puntos (.). Como la posición de cada campo está fijada por la especificación, basta con localizar los separadores para recortar cada valor, sin ningún análisis JSON.

🔐 Seguridad impuesta

DAT separa físicamente el área en texto plano (Plain) y el área cifrada (Secure) durante la transmisión de datos.
Obliga a que la información sensible se cifre siempre, y todo el proceso queda protegido por los algoritmos estándar declarados en el certificado (ECDSA, AES-GCM, etc.).

El algoritmo de cifrado lo decide el certificado, no el token. Como el token no contiene información sobre el algoritmo, no existe la superficie de ataque de confusión de algoritmos derivada de la cabecera alg de JWT.

🔄 Rotación de claves impuesta

El certificado DAT no solo gestiona la emisión y la expiración de los tokens, sino directamente el ciclo de vida de las claves.
En el certificado está grabado, a nivel de especificación, "desde cuándo y hasta cuándo se puede emitir", de modo que una vez transcurrido ese período ya no se pueden crear tokens nuevos con ese certificado. Estructuralmente no puede darse la situación de que, por descuido del administrador, se utilice una misma clave durante años.

⏱️ Separación entre la ventana de emisión y el período de validez

"El período durante el cual un certificado puede emitir tokens" y "el período durante el cual vive un token ya emitido" son valores distintos.
Gracias a ello, aunque el certificado deje de emitir, los tokens que ya salieron pueden agotar su propia vida, y mientras tanto el clúster pasa de forma natural al siguiente certificado.


Comparación de mecanismos de autenticación

AspectoDATJWTSesión
Método de autenticaciónVerificación distribuidaVerificación distribuidaCentralizado
Estructura de datosRaw Bytes
(basada en desplazamientos fijos)
JSON
(texto basado en clave-valor)
Serialized Object
(serialización de objetos)
Mecanismo de análisisMapeo inmediato de los datos en bytesRequiere análisis JSON y conversión de tiposDeserialización de objetos y E/S
Rendimiento de procesamientoEl más alto (sobrecarga de análisis mínima)Medio (depende del rendimiento del procesamiento JSON)Bajo (E/S de red y de disco)
CifradoIntegrado de serieRequiere implementar JWE por separado (complejo)No aplica
Gestión de clavesRotación impuesta por el sistema (seguridad obligatoria)Implementación propia (riesgo de gestión descuidada)No aplica
Validez de la claveDeclarada de forma obligatoria dentro de la especificación de la claveOpcional (permanente si no se gestiona)Gestionada por el servidor central
Selección del algoritmoLa decide el certificado (no está en el token)alg de la cabecera del tokenNo aplica
Momento de expiraciónCampo obligatorio por especificaciónClaim opcional (exp)Lo gestiona el servidor

Rendimiento

Emisión de DAT × 10 000 (multihilo)
Rust HMAC-512
6 ms
Go HMAC-512
9 ms
C / C++ HMAC-512
9 ms
Java / Kotlin HMAC-512
13 ms
C# HMAC-512
19 ms
Rust P256
24 ms
C / C++ P256
32 ms
Go P256
58 ms
Python HMAC-512
93 ms
Ruby HMAC-512
130 ms
JavaScript HMAC-512
134 ms
Ruby P256
155 ms
Java / Kotlin P256
158 ms
JavaScript P256
179 ms
Python P256
192 ms
C# P256
235 ms
Análisis de DAT × 10 000 (multihilo)
Rust HMAC-512
4 ms
Go HMAC-512
5 ms
Java / Kotlin HMAC-512
7 ms
C / C++ HMAC-512
8 ms
C# HMAC-512
11 ms
Rust P256
52 ms
C / C++ P256
69 ms
Go P256
72 ms
Python HMAC-512
89 ms
Java / Kotlin P256
118 ms
JavaScript HMAC-512
143 ms
Ruby HMAC-512
150 ms
JavaScript P256
167 ms
Python P256
182 ms
C# P256
185 ms
Ruby P256
194 ms
medido en mac mini m4 2024 basic (10 core) · los gráficos muestran solo IV-AES256-GCM
Datos sin procesar (ms por 10 000 operaciones)
Multi-Thread
Signature · CryptoRustGoJava / KotlinJavaScriptC#PythonRubyC / C++
IssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParse
HMAC-SHA256-MFS · IV-AES128-GCM65115121301741822215888315015299
HMAC-SHA256-MFS · IV-AES256-GCM7595221315214819151068213816288
HMAC-SHA384-MFS · IV-AES128-GCM6495503115214218151008013014588
HMAC-SHA384-MFS · IV-AES256-GCM641052271411411911928013216588
HMAC-SHA512-MFS · IV-AES128-GCM641053571391481611947913014998
HMAC-SHA512-MFS · IV-AES256-GCM64951371341431911938913015098
ECDSA-P256 · IV-AES128-GCM265753712532401841702082031911811701893275
ECDSA-P256 · IV-AES256-GCM245258721581181791672351851921821551943269
ECDSA-P384 · IV-AES128-GCM954532145935075139968585605478672,036339441196424
ECDSA-P384 · IV-AES256-GCM1452572205662482771,0418775365048691,972320490186379
ECDSA-P521 · IV-AES128-GCM2324704681,4665926812,5412,1041,5231,4627281,446352554250449
ECDSA-P521 · IV-AES256-GCM1523064671,5074735802,6811,9991,4501,4657041,395374529260454
Single-Thread
Signature · CryptoRustGoJava / KotlinJavaScriptC#PythonRubyC / C++
IssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParseIssueParse
HMAC-SHA256-MFS · IV-AES128-GCM1258430302702623534353764601615
HMAC-SHA256-MFS · IV-AES256-GCM1257432302782613535343658661514
HMAC-SHA384-MFS · IV-AES128-GCM1379628272662645544353762611718
HMAC-SHA384-MFS · IV-AES256-GCM1369630292692714034363866731717
HMAC-SHA512-MFS · IV-AES128-GCM1369628272622373836363858631717
HMAC-SHA512-MFS · IV-AES256-GCM1369630292642473735353760671716
ECDSA-P256 · IV-AES128-GCM128287165358521492447681870785210431177392156373
ECDSA-P256 · IV-AES256-GCM123274156345473503446700845782202434172394147361
ECDSA-P384 · IV-AES128-GCM4721,0901,0953,1291,2841,4234,0113,5582,1762,1134,76011,2791,0552,1551,0392,147
ECDSA-P384 · IV-AES256-GCM4741,0741,0733,1511,2841,6764,0643,4562,1552,1264,74511,2781,0392,1601,0412,151
ECDSA-P521 · IV-AES128-GCM8331,6572,6538,6652,6973,2789,8697,6036,0395,9583,4997,1151,3582,3901,3592,394
ECDSA-P521 · IV-AES256-GCM8441,6772,6528,6832,6393,2839,7997,4095,9445,8563,4887,1161,3812,3981,3602,402

Documentos siguientes

  • DAT — formato de transmisión del token y reglas canónicas
  • Certificado — estructura del certificado, algoritmos y ciclo de vida
  • Sincronización CMS — distribución de certificados y comportamientos que conviene conocer en producción