告别钥匙串弹窗:存储密钥的可选系统钥匙串加密


周一早上,你打开 Hermes 桌面应用,等来的不是聊天列表,而是一个 macOS 弹窗:*「Hermes 想要访问你的钥匙串。请输入密码以允许此操作。」*你输完密码,应用加载了。周二:同样的弹窗。天天如此,永远如此——因为应用的密钥是用一把放在登录钥匙串里的钥匙加密的,而你的钥匙串被锁、缺失或损坏了。这种唠叨让人想把电脑扔出窗外。Hermes v0.20.6(提交 6a6e16fa5d)从根上修掉了它:存储密钥的系统钥匙串加密现在是显式可选,默认路径完全不碰钥匙串。

这次改动针对桌面端存储的密钥:远程 gateway token、Cloudflare Access 头、原生 OAuth token 集合。以前 Electron 的 safeStorage 会在 macOS 登录钥匙串里放一个应用级密钥(“Hermes Key”),而任何 safeStorage 触碰——哪怕只是“加密是否可用”的检查——在默认钥匙串被锁或损坏的机器上都会触发阻塞性的钥匙串弹窗。对聊天应用来说这是不可接受的默认行为,于是行为反转:加密改为可选、明文存储成为默认、一次性迁移清理旧行为遗留。

改了什么

策略定义在一个独立模块里(electron/secret-storage-policy.ts)——刻意不带 import 'electron' 以便单元测试干净运行——三个特性:

  • 关闭(默认): 密钥以 'plain' 编码写入,绝不调用任何 safeStorage API——包括本身就会碰钥匙串的 isEncryptionAvailable()。没有钥匙串、没有弹窗、没有提示。
  • 开启: 恢复旧行为——严格 safeStorage 加密、钥匙串不可用时大声失败、每次保存明文时弹确认框作为逃生舱。
  • 一次性迁移: 开关存在之前写入的旧数据在磁盘上是 safeStorage 编码。关闭状态下,Hermes 会尝试一次迁移(解密 → 重写为明文)。无论成败,迁移动作都会记录在同一个设置文件里,所以坏钥匙串最多只会在升级后第一次启动时弹一次——绝不再是每次启动都弹。

on 标志使用严格 === true 判定:一个“真值但非 true”的值绝不能悄悄开启钥匙串弹窗(与 hardening.ts 里 allowPlainText 的强制规则一致)。策略文件位于 secure-token-storage.json

怎么用

桌面端(推荐): 打开 Settings → Gateway,找到钥匙串/安全存储开关,拨一下。切换开关会原地重新加密所有存储密钥的文件——v1 connection.json、v2 connections.jsonnative-oauth-tokens.json——at-rest 规范同时覆盖两种姿态:开启后契约不变,默认模式不用安全存储、只保留属主权限位,并覆盖重启往返测试。

值得知道的迁移细节: 如果你是从旧版本升上来的,升级后第一次启动(默认关闭状态)会尝试一次性迁移——把现有 safeStorage 数据解密成 0600 权限的明文文件。无法解密的数据(比如钥匙串已死)会留在磁盘上,但之后会被当作不存在读取,归类为 ‘drop’——死钥匙串最多只弹一次。Linux 上底层钥匙串后端可配置:desktop.password_store 接受 auto(自动检测会话钥匙串——通过 KDE 会话环境变量找 KWallet,或通过 D-Bus 找 GNOME Keyring / 任何 org.freedesktop.secrets 提供者如 KeePassXC)或强制指定后端(gnome-libsecretkwalletkwallet5kwallet6);basic 表示无加密存储。显式设置的 HERMES_DESKTOP_PASSWORD_STORE 环境变量仍然优先于配置。

什么没变

  • 选择开启的机器契约不变: 严格 safeStorage 加密、钥匙串不可用时大声失败。
  • 明文后备文件的属主权限(0600)让“明文静止存储”的姿态足够合理:只有你的用户能读。
  • 密钥仍然是密钥。 这次改的是加密钥匙放在哪(系统钥匙串 vs. 属主独占的明文文件),不是把 token 暴露到日志或模型可见内容里——现有的脱敏机制(security.redact_secrets)不受影响。

什么时候开

  • 想开: 你希望 OS 级静止加密、且钥匙串健康——笔记本、共享机器或合规场景的标准姿态。
  • 保持关闭: 你的钥匙串被锁/缺失/损坏(弹窗人群)、不想在登录钥匙串里多一把应用级钥匙、或者受够了每次启动的密码提示。默认路径现在是设计上无提示的。

更大的图景

这是 v0.20.6 可靠性主题的一部分:同一个窗口把 web 搜索缓存lean-tail 压缩 变成默认,也让更新器不再强杀网关(见我们的优雅升级指南)。密钥存储是最后一个能用密码弹窗堵住你早晨的桌面环节——现在它可选、安静、可逆。完整发版解读见 v0.20.6 发版记录

一个开关。告别每天早上的「Hermes 想要访问你的钥匙串」——除非你确实想要加密,那它还在那儿,一下拨过去就行。