01 签名式深链:验签与防重放


01 签名式深链:验签与防重放

本节摘要:OpenWork 的核心承诺是「随处分享」,Connect Link(连接链接)就是这个承诺在交付层的体现。它有两种传输模式,本节讲最安全的一种——签名式深链:用公钥签名验签(保证可信)+ 防重放保护(防止链接被重复使用)。理解了本节,你才知道一条分享链接背后的密码学有多严肃。

Connect Link 是一条深链(deep link)——一种特殊协议的链接(如 openwork://connect?...)。用户点了它,OpenWork 桌面应用会收到并处理,完成「分享」或「连接」。

生成一条 Connect Link │ ▼ 发给队友/别的设备(聊天、邮件、二维码) │ 接收方点击 │ ▼ OpenWork 桌面应用接收 │ ▼ 验证 + 处理(建立连接/接入工作区) ​

它用于「一键分享工作区」「一键连接到团队」等场景,是「随处分享」的交付载体。

二、两种传输模式

Connect Link 有两种传输模式,安全级别不同:

模式 机制 适合
签名式(signed) 公钥签名验签 + 防重放 最安全,敏感分享
交换式(exchange) 短码经服务交换 claims 更灵活,需在线

本节讲签名式,下一节讲交换式。

三、签名式:JWT 形态

签名式 Connect Link 本质是一个 JWT(JSON Web Token)——一种带签名的 token。它由三部分组成:

Connect Link token = header.payload.signature │ ├─ header: { alg: "EdDSA", typ: "JWT", kid: 公钥ID } ├─ payload: { aud, v, iss, iat, exp, jti, ... }(claims) └─ signature: 用私钥对 header.payload 的签名 ​

关键点:

  • 算法 EdDSA:用 Ed25519 椭圆曲线签名(现代、安全、快)。
  • kid(公钥 ID):接收方用这个 ID 找到对应的公钥来验签。
  • payload 含 claims:受众(aud)、版本(v)、签发者(iss)、签发时间(iat)、过期时间(exp)、唯一标识(jti)等。

四、验签:保证可信

接收方收到 Connect Link 后,第一步是验签——确认这个 token 确实是「可信签发方」发的,没被篡改:

收到 token │ ▼ 取 header 的 kid │ ▼ 在预置公钥集合里找对应公钥 │ ▼ 用公钥验签(Ed25519) │ ├─ 验签成功 ──► token 可信,继续 └─ 验签失败 ──► 拒绝(可能被篡改/伪造) ​

OpenWork 桌面端内嵌了一批可信公钥(对应可信签发方)。只有用这些公钥能验签的 token 才被接受——这防止了「任意人伪造 Connect Link」。

💡 验签的本质:它回答「这个 token 是不是可信签发方发的」。私钥只在签发方手里,接收方用对应公钥验签——签对了就说明是私钥持有者发的,可信。

五、Claims 校验

验签后,还要校验 payload 里的 claims(声明),确保 token 的内容合法:

claim 校验
aud(受众) 必须是 "openwork-desktop-connect"(目标对)
v(版本) 必须是 1(版本对)
iat / exp 签发/过期时间,允许 ±60 秒时钟偏差
所有 URL 必须 https(loopback 例外,防中间人)
claims schema 结构必须符合预期

这些校验保证 token 「内容也合法」——不光签名对,内容也得是预期的格式和值。

六、防重放保护

这是签名式最关键的安全机制。考虑:一条 Connect Link 被截获了,攻击者能不能反复用它?如果没有防重放,能——token 有效期内可被无限次使用。

OpenWork 用 jti(JSON Web Token ID) 防重放——每个 token 有唯一 ID,用过就记下,再用就拒:

token 带唯一 jti │ ▼ 第一次使用 │ ▼ 记下 jti(存入一个集合,最多 N 条如 512) │ ▼ 处理这次连接 │ 第二次使用(同一 jti) │ ▼ 检查:jti 已在集合里? │ ▼ 是 ──► 拒绝(重放!) ​

⚠️ 防重放是分享链接的底线:没有它,被截获的链接能被无限复用——攻击者截了一条连接链接,能反复连。防重放让每条链接「用一次或受限次」,大幅降低截获风险。

七、防重放集合的管理

防重放集合(存已用 jti)有几个细节:

  • 容量有限(如 512 条):满了挤掉最老的。这平衡了「防重放时长」和「内存」——超过容量后,老 jti 被忘掉,理论上老链接能被重用,但那时链接通常也过期了(exp 校验会拒)。
  • 原子消费:检查+记下是原子的,防并发竞态(两条同 jti 同时到,只一条成功)。

八、本节要点回顾

  1. Connect Link:深链,「随处分享」的交付载体。
  2. 两种模式:签名式(验签+防重放)/ 交换式(短码换 claims)。
  3. 签名式是 JWT:header(alg EdDSA + kid)+ payload(claims)+ signature。
  4. 验签保证可信:用预置公钥集合验签,只信可信签发方。
  5. claims 校验:aud/v/iat/exp/URL https/schema 全要合法。
  6. 防重放用 jti:每 token 唯一 ID,用过记下,再用拒绝。
  7. 防重放是底线:防截获后被无限复用;集合有限容量+原子消费。

签名式讲清了,下一节讲交换式——更灵活的传输。


作者与出处
原作者: 灏天文库
来源:different-ai
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: 灏天文库 转发
评论区 (0)
U