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

周一早上,你打开 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.json、native-oauth-tokens.json——at-rest 规范同时覆盖两种姿态:开启后契约不变,默认模式不用安全存储、只保留属主权限位,并覆盖重启往返测试。
值得知道的迁移细节: 如果你是从旧版本升上来的,升级后第一次启动(默认关闭状态)会尝试一次性迁移——把现有 safeStorage 数据解密成 0600 权限的明文文件。无法解密的数据(比如钥匙串已死)会留在磁盘上,但之后会被当作不存在读取,归类为 ‘drop’——死钥匙串最多只弹一次。Linux 上底层钥匙串后端可配置:desktop.password_store 接受 auto(自动检测会话钥匙串——通过 KDE 会话环境变量找 KWallet,或通过 D-Bus 找 GNOME Keyring / 任何 org.freedesktop.secrets 提供者如 KeePassXC)或强制指定后端(gnome-libsecret、kwallet、kwallet5、kwallet6);basic 表示无加密存储。显式设置的 HERMES_DESKTOP_PASSWORD_STORE 环境变量仍然优先于配置。
什么没变
- 选择开启的机器契约不变: 严格 safeStorage 加密、钥匙串不可用时大声失败。
- 明文后备文件的属主权限(0600)让“明文静止存储”的姿态足够合理:只有你的用户能读。
- 密钥仍然是密钥。 这次改的是加密钥匙放在哪(系统钥匙串 vs. 属主独占的明文文件),不是把 token 暴露到日志或模型可见内容里——现有的脱敏机制(
security.redact_secrets)不受影响。
什么时候开
- 想开: 你希望 OS 级静止加密、且钥匙串健康——笔记本、共享机器或合规场景的标准姿态。
- 保持关闭: 你的钥匙串被锁/缺失/损坏(弹窗人群)、不想在登录钥匙串里多一把应用级钥匙、或者受够了每次启动的密码提示。默认路径现在是设计上无提示的。
更大的图景
这是 v0.20.6 可靠性主题的一部分:同一个窗口把 web 搜索缓存 和 lean-tail 压缩 变成默认,也让更新器不再强杀网关(见我们的优雅升级指南)。密钥存储是最后一个能用密码弹窗堵住你早晨的桌面环节——现在它可选、安静、可逆。完整发版解读见 v0.20.6 发版记录。
一个开关。告别每天早上的「Hermes 想要访问你的钥匙串」——除非你确实想要加密,那它还在那儿,一下拨过去就行。