Skip to content

v1.6.1 — 同机双 build 凭据按各自 keyId 解开

Choose a tag to compare

@XDTrees XDTrees released this 25 Sep 03:44
· 62 commits to main since this release

修复:同机双桌面 build 时,凭据按各自 keyId 解开

背景

国内 WorkBuddy.exe 与国际版 WorkBuddyAI.exe 各自独立密钥,每个加密字段的 envelope
里带 keyId。同机双 build 时,旧实现假设"全局唯一一把密钥",闭包内直接用同一把 key
解所有字段 —— 一旦 keyId 不匹配就报 ciphertext 错误 / 找不到账号。

修法(src/at-rest.ts + src/accounts.ts)

  • encryptedFieldKeyId(field):从 envelope.keyId 取字段自己被封印时用的 keyId。
  • atRestKeyById: Map<string, Buffer>:opener 预热时由所有已安装 build 各自 spawn 回填。
  • atRestKeyFor(keyId):同步按 keyId 查已加载密钥;查不到返回 undefined(交回 opener 报
    "此字段无可用密钥"而非静默空串)。
  • setAtRestKeysForTest([{keyId,key}]):test-only 注入,免 spawn 桌面 App。
  • encryptedFieldOpener 先 await readAtRestKey() 预热缓存,再返回同步闭包:闭包内
    按字段 envelope.keyId 用 atRestKeyFor 选密钥,而非假设单一全局密钥。

回归测试(新增 3 例,全仓 195 → 198)

  • 两个不同 keyId 字段各用自身 build 密钥解开(idA≠idB,互不影响)。
  • keyId 无 build 提供 → 抛错(含 no at-rest key available),而非返回空。
  • 存在错误密钥(第三 unrelated payload)时仍命中正确 key,不被误用。

验证

npm run typecheck 通过;npm test 全绿(16 文件 / 198 用例,含
encrypted-credentials.test.ts 10 例)。