DAT (Distributed Access Token)


Contexte d'introduction du DAT

Aujourd'hui, de nombreux systèmes adoptent JWT, mais des limitations structurelles subsistent dans les environnements de production réels.
C'est pour les résoudre qu'une nouvelle spécification de token, DAT, a été conçue.

🧩 Fragmentation des spécifications de sécurité et absence de caractère obligatoire

JWT fournit des standards de chiffrement tels que JWE, mais leur utilisation n'est pas imposée.
En conséquence, de nombreux environnements de développement omettent le chiffrement ou transmettent les données par des méthodes non standard, ce qui engendre des vulnérabilités de sécurité.

🔑 Risque de sécurité lié à l'utilisation de clés statiques (Static Key)

La rotation des clés de signature (Key Rolling) n'étant pas obligatoire, il est fréquent qu'une clé unique soit utilisée pendant une longue période. Cela peut entraîner l'effondrement de la sécurité de tout le système en cas de vol de la clé ; des incidents de compromission de ce type se sont d'ailleurs produits sur de grands sites de commerce en ligne.

📉 Dégradation des performances due à la surcharge

JWT effectue une analyse JSON à chaque requête et consomme des ressources CPU considérables. Dans les environnements exigeant de hautes performances, ce coût d'analyse peut devenir le goulot d'étranglement de l'ensemble du système.


Philosophie centrale du DAT

DAT est conçu selon le principe que la sécurité doit être imposée et non optionnelle, et que les performances ne sont pas négociables.

⚡ Léger et rapide

expire
uint64 (décimal)
.
cid
uint64 (hexadécimal)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
Survolez chaque champ pour afficher son explication.

Comme ci-dessus, DAT ne comporte que cinq champs fixes séparés par des points (.). La position de chaque champ étant fixée par la spécification, il suffit de repérer les séparateurs pour découper chaque valeur, sans aucune analyse JSON.

🔐 Sécurité imposée

Lors de la transmission des données, DAT sépare physiquement la zone en clair (Plain) et la zone chiffrée (Secure).
Il impose que les informations sensibles soient obligatoirement chiffrées, et l'ensemble du processus est protégé par les algorithmes standard déclarés dans le certificat (ECDSA, AES-GCM, etc.).

L'algorithme de chiffrement est déterminé par le certificat, et non par le token. Aucune information d'algorithme n'étant présente dans le token, la surface d'attaque par confusion d'algorithme issue de l'en-tête alg de JWT n'existe pas.

🔄 Rotation de clés imposée

Le certificat DAT gère directement le cycle de vie des clés, en plus de l'émission et de l'expiration des tokens.
Le certificat porte, au niveau de la spécification, l'information « de quand à quand l'émission est possible » : une fois cette période écoulée, il n'est plus possible de créer de nouveaux tokens avec ce certificat. La situation où, par négligence d'un administrateur, une même clé serait utilisée pendant des années ne peut structurellement pas se produire.

⏱️ Séparation de la fenêtre d'émission et de la durée de validité

« La période pendant laquelle un certificat peut émettre des tokens » et « la durée de vie d'un token émis » sont deux valeurs distinctes.
Ainsi, même après que le certificat a cessé d'émettre, les tokens déjà distribués peuvent aller au bout de leur durée de vie, pendant que le cluster bascule naturellement vers le certificat suivant.


Comparaison des mécanismes d'authentification

ClassificationDATJWTSession
Méthode d'authentificationVérification distribuéeVérification distribuéeCentralisée
Structure des donnéesRaw Bytes
(basé sur des décalages fixes)
JSON
(texte Key-Value)
Serialized Object
(sérialisation d'objet)
Mécanisme d'analyseMappage immédiat des données ByteAnalyse JSON et transtypage nécessairesDésérialisation d'objet et I/O
Performance de traitementOptimale (surcharge d'analyse minimale)Moyenne (dépend des performances de traitement JSON)Faible (I/O réseau/disque)
ChiffrementIntégré par défautImplémentation JWE distincte nécessaire (complexe)Non applicable
Gestion des clésRotation imposée par le système (sécurité imposée)Implémentation manuelle (risque de négligence)Non applicable
Durée de validité des clésImposée et explicite dans la spécification des clésOptionnelle (permanente en l'absence de gestion)Gérée par le serveur central
Choix de l'algorithmeDéterminé par le certificat (absent du token)Champ alg de l'en-tête du tokenNon applicable
Date d'expirationChamp obligatoire par spécificationClaim optionnel (exp)Géré par le serveur

Performances

Émission DAT × 10 000 (multi-thread)
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
Analyse DAT × 10 000 (multi-thread)
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
mesuré sur mac mini m4 2024 basic (10 core) · les graphiques n'affichent que IV-AES256-GCM
Données brutes (ms pour 10 000 opérations)
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

Documents suivants

  • DAT — format de trame du token et règles canoniques
  • Certificat — structure du certificat, algorithmes, cycle de vie
  • Synchronisation CMS — distribution des certificats et comportements à connaître en exploitation