DAT (Distributed Access Token)


Предпосылки появления DAT

Сегодня многие системы используют JWT, однако в реальной эксплуатации у него есть следующие структурные ограничения.
Чтобы устранить их, и была разработана новая спецификация токена — DAT.

🧩 Фрагментация требований безопасности и отсутствие принуждения

JWT предоставляет стандарты шифрования, такие как JWE, но их применение не является обязательным.
Из-за этого во многих средах разработки шифрование опускают или передают данные нестандартными способами, что порождает уязвимости в безопасности.

🔑 Риски безопасности при использовании статического ключа (Static Key)

Ротация подписывающего ключа (Key Rolling) не является обязательной, поэтому один и тот же ключ нередко используется годами. При компрометации такого ключа это приводит к обрушению безопасности всей системы — подобные инциденты действительно происходили на крупных коммерческих сайтах.

📉 Снижение производительности из-за накладных расходов

JWT выполняет разбор JSON при каждом запросе и потребляет заметный объём ресурсов CPU. В средах с высокими требованиями к производительности эти затраты на разбор способны стать общесистемным узким местом.


Основная философия DAT

DAT разработан по принципу: безопасность должна быть не выбором, а обязанностью, а производительностью нельзя жертвовать.

⚡ Лёгкий и быстрый

expire
uint64 (дес.)
.
cid
uint64 (шестн.)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
Наведите курсор на поле, чтобы увидеть описание.

Как показано выше, DAT состоит всего из пяти фиксированных полей, разделённых точкой (.). Позиции полей заданы спецификацией, поэтому каждое значение можно вырезать, просто найдя разделители, без разбора JSON.

🔐 Принудительная безопасность

При передаче данных DAT физически разделяет область открытого текста (Plain) и область шифрования (Secure).
Конфиденциальная информация обязательно шифруется, а весь процесс защищён стандартными алгоритмами, объявленными в сертификате (ECDSA, AES-GCM и др.).

Алгоритм шифрования определяет сертификат, а не токен. В токене нет сведений об алгоритме, поэтому у DAT отсутствует поверхность атаки на путаницу алгоритмов, которая возникает из-за заголовка alg в JWT.

🔄 Принудительная ротация ключей

Сертификат DAT управляет не только выпуском и истечением срока действия токенов, но и напрямую жизненным циклом ключей.
В сертификате на уровне спецификации зафиксировано, «с какого и по какой момент разрешён выпуск», и по окончании этого периода создать новый токен этим сертификатом невозможно. Ситуация, когда по невнимательности администратора один ключ используется несколько лет, структурно исключена.

⏱️ Разделение срока выдачи и срока действия

«Период, в течение которого сертификат может выпускать токены», и «период, в течение которого выпущенный токен остаётся живым», — это разные значения.
Благодаря этому уже выданные токены успевают прожить весь свой срок даже после того, как сертификат перестал их выпускать, а кластер тем временем естественным образом переходит на следующий сертификат.


Сравнение механизмов аутентификации

КатегорияDATJWTСессия
Метод аутентификацииРаспределённая верификацияРаспределённая верификацияЦентрализованная
Структура данныхRaw Bytes
(на основе фиксированного смещения)
JSON
(текст в формате ключ-значение)
Serialized Object
(сериализация объектов)
Механизм разбораПрямое отображение байтовых данныхТребует разбора JSON и приведения типовТребует десериализации объектов и I/O
ПроизводительностьМаксимальная (минимальные накладные расходы на разбор)Средняя (зависит от скорости обработки JSON)Низкая (сетевой/дисковый I/O)
ШифрованиеВстроено по умолчаниюТребует отдельной реализации JWE (сложно)Не применимо
Управление ключамиПринудительная системная ротация (безопасность обязательна)Требует самостоятельной реализации (риск халатности)Не применимо
Срок действия ключаОбязательно указан в самой спецификации ключаОпционально (бессрочно при отсутствии управления)Управляется центральным сервером
Выбор алгоритмаОпределяет сертификат (в токене отсутствует)Заголовок токена algНе применимо
Время истеченияОбязательное поле по спецификацииОпциональный claim (exp)Управляется сервером

Производительность

Выпуск DAT × 10 000 (многопоточно)
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 × 10 000 (многопоточно)
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
измерено на mac mini m4 2024 basic (10 core) · графики показывают только IV-AES256-GCM
Исходные данные (мс на 10 000 операций)
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

Дальнейшие документы

  • DAT — проводной формат токена и канонические правила
  • Сертификат — структура сертификата, алгоритмы, жизненный цикл
  • Синхронизация CMS — распространение сертификатов и поведение, о котором нужно знать при эксплуатации