本节摘要:OpenWork 的核心承诺是「随处分享」,Connect Link(连接链接)就是这个承诺在交付层的体现。它有两种传输模式,本节讲最安全的一种——签名式深链:用公钥签名验签(保证可信)+ 防重放保护(防止链接被重复使用)。理解了本节,你才知道一条分享链接背后的密码学有多严肃。
Connect Link 是一条深链(deep link)——一种特殊协议的链接(如 openwork://connect?...)。用户点了它,OpenWork 桌面应用会收到并处理,完成「分享」或「连接」。
生成一条 Connect Link │ ▼ 发给队友/别的设备(聊天、邮件、二维码) │ 接收方点击 │ ▼ OpenWork 桌面应用接收 │ ▼ 验证 + 处理(建立连接/接入工作区)
它用于「一键分享工作区」「一键连接到团队」等场景,是「随处分享」的交付载体。
Connect Link 有两种传输模式,安全级别不同:
| 模式 | 机制 | 适合 |
|---|---|---|
| 签名式(signed) | 公钥签名验签 + 防重放 | 最安全,敏感分享 |
| 交换式(exchange) | 短码经服务交换 claims | 更灵活,需在线 |
本节讲签名式,下一节讲交换式。
签名式 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 的签名
关键点:
接收方收到 Connect Link 后,第一步是验签——确认这个 token 确实是「可信签发方」发的,没被篡改:
收到 token │ ▼ 取 header 的 kid │ ▼ 在预置公钥集合里找对应公钥 │ ▼ 用公钥验签(Ed25519) │ ├─ 验签成功 ──► token 可信,继续 └─ 验签失败 ──► 拒绝(可能被篡改/伪造)
OpenWork 桌面端内嵌了一批可信公钥(对应可信签发方)。只有用这些公钥能验签的 token 才被接受——这防止了「任意人伪造 Connect Link」。
💡 验签的本质:它回答「这个 token 是不是可信签发方发的」。私钥只在签发方手里,接收方用对应公钥验签——签对了就说明是私钥持有者发的,可信。
验签后,还要校验 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)有几个细节:
签名式讲清了,下一节讲交换式——更灵活的传输。