瀏覽代碼

匹配原生加密助手最低系统版本并记录验证边界

LSamien 1 月之前
父節點
當前提交
5455a9804e
共有 2 個文件被更改,包括 12 次插入 和 3 次删除
  1. 9 1
      docs/macos-app.md
  2. 3 2
      scripts/build-desktop.mjs

+ 9 - 1
docs/macos-app.md

@@ -9,7 +9,7 @@ App、Web 服务、Vue 界面和 Runner 同仓维护。打开 App 会先核对
 - 老 CLI 服务没有描述文件时,只有确认它同时持有目标 SQLite 文件和监听端口才连接。
 - 关闭窗口保留任务;菜单栏和 Dock 可恢复。明确退出等待自己托管的 Runner 和服务结束,不停止外部服务。停止无法确认时显示实际清理错误。
 - 服务崩溃有界重启,睡眠恢复后重新核对连接;错误页面提供重试和日志。
-- Runner 配置由原生文件选择器导入,通过系统加密存储及私有进程消息传递。Web 页面没有配置解密或桌面启动权限,外部页面不能调用原生桥。
+- Runner 配置由原生文件选择器导入。新配置用 AES-GCM 加密,密钥按数据目录保存在系统钥匙串中;加密助手仅允许所属、同签名团队的 App 调用,明文通过私有进程管道传递。旧 safeStorage 格式仍可在系统授权后读取。Web 页面没有配置解密或桌面启动权限,外部页面不能调用原生桥。
 
 ## 登录启动
 
@@ -41,3 +41,11 @@ hdiutil verify desktop-release/Yaoyao-0.3.32-arm64.dmg
 开发 App 的 6 项测试通过:真实内置服务启动、账号与 Runner 连接、关闭窗口保持运行、服务崩溃恢复、外部客户端不误停服务、退出清理、加密配置再次启动、偏好保存及手动重新打开、版本不符拒绝、钥匙串失败保护。另有更新器 14 项定向测试通过,包含 App 禁用源码更新及回退。
 
 `desktop-release` 中现有旧包仍是此前阶段快照。最终完整平台尚需重新打包、严格签名验证并对实际 App 重跑生命周期测试;开发签名、公证、安装、发布分别记录,不混为已交付。
+
+### 原生加密核对
+
+Electron 初始化时设置其钥匙串项目名称([v43.4.0 源码](https://github.com/electron/electron/blob/v43.4.0/shell/browser/electron_browser_main_parts.cc#L524))。首次签名包验收在旧项目的系统授权上等待,未修改其权限。新配置改用 Runner 专属、按数据目录区分的原生项目;旧配置保持兼容读取,不强制迁移。
+
+助手使用 CryptoKit AES-GCM、Security.framework 和私有 stdin/stdout,不把密钥放进环境变量、参数或日志。分发版本验证调用 App 路径、签名和团队,拒绝外部 shell 调用;仅用于源码开发的测试助手不会进入安装包。钥匙串调用有 30 秒上限,失败保留原配置。
+
+原生钥匙串加密往返、密文篡改拒绝、跨数据目录拒绝、外部直接调用拒绝,以及完整 Runner 导入/退出/恢复等 8 项桌面测试通过。

+ 3 - 2
scripts/build-desktop.mjs

@@ -13,8 +13,9 @@ await build({ entryPoints: [resolve(root, 'src/server/index.ts')], outfile: reso
   define: { 'process.env.NODE_ENV': '"production"' }, sourcemap: true,
 })
 await buildRunner(out)
-execFileSync('xcrun',['swiftc','-O',resolve(root,'desktop/keychain-helper.swift'),'-o',resolve(out,'keychain-helper')],{stdio:'inherit'})
-execFileSync('xcrun',['swiftc','-O','-D','DEVELOPMENT_HELPER',resolve(root,'desktop/keychain-helper.swift'),'-o',resolve(out,'keychain-helper-dev')],{stdio:'inherit'})
+const swiftTarget=process.arch==='arm64'?'arm64-apple-macosx12.0':'x86_64-apple-macosx12.0'
+execFileSync('xcrun',['swiftc','-O','-target',swiftTarget,resolve(root,'desktop/keychain-helper.swift'),'-o',resolve(out,'keychain-helper')],{stdio:'inherit'})
+execFileSync('xcrun',['swiftc','-O','-target',swiftTarget,'-D','DEVELOPMENT_HELPER',resolve(root,'desktop/keychain-helper.swift'),'-o',resolve(out,'keychain-helper-dev')],{stdio:'inherit'})
 await cp(resolve(root, 'dist'), resolve(out, 'ui'), { recursive: true })
 await cp(resolve(root, 'release.json'), resolve(out, 'release.json'))
 await cp(resolve(root, 'public/icons/icon-512.png'), resolve(root, 'desktop/icon.png'))