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 等)加以保护。

加密算法由证书决定,而非由令牌决定。令牌中不含任何算法信息,因此不存在源自 JWT alg 头部的算法混淆攻击面。

🔄 强制的密钥轮换

DAT 证书不仅管理令牌的签发与过期,还直接管理密钥的生命周期
证书在规范层面就写死了“从何时到何时可以签发”,一旦超出该期限,就无法再用该证书生成新的令牌。因此,管理员因疏忽而把同一把密钥用上好几年的情况,从结构上就不会发生。

⏱️ 签发期限与有效期的分离

“证书可以签发令牌的期限”与“已签发令牌的存活期限”是两个不同的值。
得益于此,即使证书停止签发之后,已经发出的令牌仍能走完自己的寿命,而集群则在这段时间里自然地过渡到下一张证书。


认证机制比较

分类DATJWTSession
认证方式分布式验证分布式验证集中式
数据结构Raw Bytes
(基于固定偏移量)
JSON
(基于 Key-Value 文本)
Serialized Object
(对象序列化)
解析机制字节数据即时映射需要 JSON 解析和类型转换需要对象反序列化和 I/O
处理性能最高(解析开销最小化)中等(依赖 JSON 处理性能)低(网络/磁盘 I/O)
加密默认内置需要单独实现 JWE(复杂)不适用
密钥管理系统强制轮换(强制安全)需要自行实现(存在疏于管理的风险)不适用
密钥有效期在密钥规范中强制明确可选(未管理时永久有效)由中央服务器管理
算法选择由证书决定(令牌中不含)令牌头部的 alg不适用
过期时间规范上的必填字段可选声明(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 同步 — 证书分发以及运维时需要了解的行为