DAT (Distributed Access Token)


Hintergrund der Einführung von DAT

Heute setzen viele Systeme auf JWT, doch im realen Produktionsbetrieb bestehen die folgenden strukturellen Grenzen.
Um diese zu überwinden, wurde die neue Token-Spezifikation DAT entworfen.

🧩 Fragmentierung der Sicherheitsspezifikation und fehlende Durchsetzung

JWT bietet zwar Verschlüsselungsstandards wie JWE an, deren Verwendung wird jedoch nicht erzwungen.
Dadurch verzichten viele Entwicklungsumgebungen auf die Verschlüsselung oder übertragen Daten auf nicht standardisierte Weise, was Sicherheitslücken verursacht.

🔑 Sicherheitsrisiko durch statische Schlüssel (Static Key)

Da die Rotation von Signaturschlüsseln (Key-Rolling) nicht verpflichtend ist, wird ein einzelner Schlüssel häufig über lange Zeiträume verwendet. Bei einer Kompromittierung des Schlüssels kann dies zum Zusammenbruch der Sicherheit des gesamten Systems führen; tatsächlich sind auf großen Commerce-Sites bereits Sicherheitsvorfälle dieser Art aufgetreten.

📉 Leistungseinbußen durch Overhead

JWT durchläuft bei jeder Anfrage einen JSON-Parsing-Vorgang und verbraucht dabei erhebliche CPU-Ressourcen. In Umgebungen mit hohen Leistungsanforderungen können diese Parsing-Kosten zum Engpass des gesamten Systems werden.


Kernphilosophie von DAT

DAT wurde nach dem Grundsatz entworfen, dass Sicherheit nicht optional, sondern erzwungen sein muss und dass bei der Leistung keine Kompromisse eingegangen werden dürfen.

⚡ Leicht und schnell

expire
uint64 (dezimal)
.
cid
uint64 (hexadezimal)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
Bewegen Sie den Mauszeiger über ein Feld, um dessen Beschreibung anzuzeigen.

Wie oben dargestellt, besitzt DAT genau fünf feste, durch Punkte (.) getrennte Felder. Da die Position jedes Feldes durch die Spezifikation festgelegt ist, lassen sich die einzelnen Werte ohne JSON-Parsing allein anhand der Trennzeichen herausschneiden.

🔐 Erzwungene Sicherheit

DAT trennt bei der Datenübertragung den Klartextbereich (Plain) und den verschlüsselten Bereich (Secure) physisch voneinander.
Sensible Informationen müssen zwingend verschlüsselt werden, und der gesamte Vorgang wird durch die im Zertifikat deklarierten Standardalgorithmen (ECDSA, AES-GCM usw.) geschützt.

Über den Verschlüsselungsalgorithmus entscheidet das Zertifikat, nicht das Token. Da das Token keinerlei Algorithmusinformationen enthält, existiert die Angriffsfläche für Algorithmusverwechslungsangriffe, wie sie der alg-Header von JWT eröffnet, hier gar nicht.

🔄 Erzwungenes Key-Rolling

DAT-Zertifikate verwalten nicht nur Ausstellung und Ablauf von Tokens, sondern unmittelbar auch den Lebenszyklus der Schlüssel.
Im Zertifikat ist auf Spezifikationsebene festgeschrieben, „von wann bis wann ausgestellt werden darf". Nach Ablauf dieses Zeitraums lassen sich mit dem Zertifikat keine neuen Tokens mehr erzeugen. Die Situation, dass aus Unachtsamkeit des Administrators ein einzelner Schlüssel jahrelang verwendet wird, kann strukturell nicht eintreten.

⏱️ Trennung von Ausstellungsfenster und Gültigkeitsdauer

„Der Zeitraum, in dem ein Zertifikat Tokens ausstellen darf" und „der Zeitraum, in dem ein ausgestelltes Token gültig bleibt" sind zwei verschiedene Werte.
Dadurch können bereits ausgegebene Tokens ihre volle Lebensdauer ausschöpfen, auch nachdem das Zertifikat die Ausstellung eingestellt hat, während der Cluster in der Zwischenzeit reibungslos auf das nächste Zertifikat übergeht.


Vergleich der Authentifizierungsmechanismen

KriteriumDATJWTSession
AuthentifizierungsmethodeVerteilte VerifizierungVerteilte VerifizierungZentralisiert
DatenstrukturRaw Bytes
(auf festen Offsets basierend)
JSON
(Key-Value, textbasiert)
Serialized Object
(Objektserialisierung)
Parsing-MechanismusDirekte Zuordnung der Byte-DatenJSON-Parsing und Typumwandlung erforderlichObjekt-Deserialisierung und I/O erforderlich
VerarbeitungsleistungHöchste (minimaler Parsing-Overhead)Mittel (abhängig von der JSON-Verarbeitungsleistung)Niedrig (Netzwerk-/Festplatten-I/O)
VerschlüsselungStandardmäßig enthaltenJWE muss separat implementiert werden (komplex)Nicht anwendbar
SchlüsselverwaltungSystemseitig erzwungenes Rolling (erzwungene Sicherheit)Eigene Implementierung (Risiko nachlässiger Verwaltung)Nicht anwendbar
SchlüsselgültigkeitsdauerIn der Schlüsselspezifikation zwingend angegebenOptional (ohne Verwaltung dauerhaft)Vom zentralen Server verwaltet
AlgorithmuswahlVom Zertifikat bestimmt (nicht im Token)alg im Token-HeaderNicht anwendbar
AblaufzeitLaut Spezifikation PflichtfeldOptionaler Claim (exp)Vom Server verwaltet

Performance

DAT-Ausstellung × 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
DAT-Parsing × 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
gemessen auf mac mini m4 2024 basic (10 core) · Diagramme zeigen nur IV-AES256-GCM
Rohdaten (ms pro 10.000 Operationen)
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

Weiterführende Dokumente

  • DAT — Wire-Format des Tokens und kanonische Regeln
  • Zertifikat — Zertifikatsstruktur, Algorithmen, Lebenszyklus
  • CMS-Synchronisierung — Zertifikatsverteilung und im Betrieb zu beachtendes Verhalten