DAT (Distributed Access Token)


Contexto da Criação do DAT

Atualmente, muitos sistemas adotam o JWT, mas em ambientes de produção reais existem as seguintes limitações estruturais.
Para resolvê-las, foi projetada uma nova especificação de token: o DAT.

🧩 Fragmentação das especificações de segurança e falta de obrigatoriedade

O JWT fornece padrões de criptografia como o JWE, mas seu uso não é obrigatório.
Por isso, muitos ambientes de desenvolvimento omitem a criptografia ou transmitem dados por métodos não padronizados, gerando vulnerabilidades de segurança.

🔑 Risco de segurança pelo uso de chave estática (Static Key)

Como a rotação das chaves de assinatura (Key Rolling) não é obrigatória, é frequente que uma única chave seja usada por longos períodos. Isso pode levar ao colapso da segurança de todo o sistema em caso de roubo da chave e, de fato, já houve incidentes de violação por esse motivo em grandes sites de comércio eletrônico.

📉 Degradação de desempenho por sobrecarga

O JWT passa por um processo de análise (parsing) JSON a cada requisição, consumindo recursos consideráveis de CPU. Em ambientes que exigem alto desempenho, esse custo de análise pode se tornar o gargalo geral do sistema.


Filosofia central do DAT

O DAT foi projetado sob o princípio de que a segurança deve ser obrigatória e não opcional, e de que o desempenho não é negociável.

⚡ Leve e rápido

expire
uint64 (decimal)
.
cid
uint64 (hexadecimal)
.
plain
Base64Url
.
secure
Base64Url
.
signature
Base64Url
Passe o mouse sobre cada campo para ver a descrição.

Como mostrado acima, o DAT possui apenas cinco campos fixos separados por ponto (.). Como a posição de cada campo é definida pela especificação, é possível recortar cada valor apenas localizando os separadores, sem análise JSON.

🔐 Segurança imposta

O DAT separa fisicamente as regiões de texto simples (Plain) e criptografada (Secure) na transmissão de dados.
As informações sensíveis são obrigatoriamente criptografadas, e todo o processo é protegido por algoritmos padronizados declarados no certificado (ECDSA, AES-GCM, etc.).

O algoritmo de criptografia é decidido pelo certificado, não pelo token. Como o token não carrega informação de algoritmo, não existe a superfície de ataque de confusão de algoritmo que decorre do cabeçalho alg do JWT.

🔄 Rotação de chaves imposta

O certificado DAT gerencia diretamente não apenas a emissão e a expiração dos tokens, mas também o ciclo de vida das chaves.
O certificado traz gravado, no nível da especificação, "de quando até quando é possível emitir"; passado esse período, não é possível criar novos tokens com aquele certificado. A situação em que, por descuido do administrador, uma única chave acaba sendo usada por anos não ocorre estruturalmente.

⏱️ Separação entre janela de emissão e período de validade

"O período em que o certificado pode emitir tokens" e "o período em que o token emitido permanece vivo" são valores distintos.
Graças a isso, mesmo depois que o certificado para de emitir, os tokens já emitidos podem cumprir toda a sua vida útil, e nesse intervalo o cluster migra naturalmente para o próximo certificado.


Comparação de mecanismos de autenticação

ClassificaçãoDATJWTSessão
Método de autenticaçãoVerificação distribuídaVerificação distribuídaCentralizado
Estrutura de dadosRaw Bytes
(baseado em offset fixo)
JSON
(texto baseado em chave-valor)
Serialized Object
(serialização de objeto)
Mecanismo de análiseMapeamento imediato dos dados em bytesRequer análise JSON e type castingRequer desserialização de objetos e I/O
Desempenho de processamentoMáximo (sobrecarga de análise mínima)Moderado (depende do desempenho do processamento JSON)Baixo (I/O de rede/disco)
CriptografiaNativaRequer implementação separada de JWE (complexo)Não aplicável
Gerenciamento de chavesRotação imposta pelo sistema (segurança imposta)Implementação própria (risco de descuido de gestão)Não aplicável
Validade da chaveObrigatoriamente explícita na especificação da chaveOpcional (permanente se não houver gestão)Gerenciada pelo servidor central
Escolha do algoritmoDecidida pelo certificado (ausente no token)alg no cabeçalho do tokenNão aplicável
Momento de expiraçãoCampo obrigatório na especificaçãoClaim opcional (exp)Gerenciado pelo servidor

Desempenho

Emissão de 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
Análise de 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
medido em mac mini m4 2024 basic (10 core) · os gráficos mostram apenas IV-AES256-GCM
Dados brutos (ms por 10.000 operações)
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

Próximos documentos

  • DAT — formato wire do token e regras canônicas
  • Certificado — estrutura do certificado, algoritmos e ciclo de vida
  • Sincronização do CMS — distribuição de certificados e comportamentos que se deve conhecer na operação