Repository navigation
v1.6.1 — 同机双 build 凭据按各自 keyId 解开
修复:同机双桌面 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 例)。