Hermes 帮你登录网站:密码不进模型,2FA 和密码管理器自动接上

凌晨两点,你的定时任务跑到最后一步:把报表提交到后台系统。它停在登录页上不动了——需要邮箱和密码,而坐在聊天窗口里的模型只能开口问你。你把密码粘进对话,任务跑完了,但那串密码从此留在了会话记录、日志和模型上下文里。第二天你想改密码,还得先想清楚它到底散落在几个地方。Hermes 从 v0.22.0 开始换了做法:遇到登录页,它就地弹出输入框问你要不要存下来,之后这些站点它自己就能登进去,密码始终不进对话。
第一次遇到登录页,它只问你一次
在 CLI 或 TUI 里,这个提示是一行掩码文本,形如 🔐 Save login for github.com:先输入标识(会显示出来),再输密码(不回显)。Desktop 上则是一张卡片「Save your github.com login?」,里面有一个标识字段、一个掩码密码字段,以及 Save & sign in 和 Don’t save 两个按钮。需要配置的东西没有——不用生成密钥、不用改配置文件,装好 Hermes 就能用。
存过之后就是「直接就能进」。密码在本机加密保存,填的时候直接注入到页面里,模型看不到。模型拿到的工具结果只有 {filled_fields: 1, origin: "https://github.com"} 这一行;密码同时注册进了脱敏器(redactor),所以之后读取页面也无法把它回显出来。
两步验证:自动填、问你一句,或者你自己在设备上点
| 情况 | 谁处理 |
|---|---|
登录项里存了 authenticator key(网站开启 2FA 时给出的 setup key 或 otpauth:// 链接;1Password / Bitwarden 里带 TOTP 种子的条目也算) |
Hermes 自己算出当前验证码并填入,不会打扰你 |
| 验证码发到手机或邮箱 | 界面上弹出小提示「Verification code for github.com」,你输入,Hermes 填进页面;验证码同样不进对话 |
| passkey、硬件密钥、App 内点确认(比如在 Duo 里点 Approve) | 没有可填的内容。Agent 会告诉你去设备上完成,然后等页面往前走 |
authenticator key 的添加位置是 Settings → Passwords & Logins → Add,或者用命令行 hermes vault add;配上之后条目上会显示「2FA auto」徽标。
已经在用 1Password 或 Bitwarden?不用开任何开关
只要 op 或 bw 命令行工具装了并处于登录状态,Hermes 就会自动识别,那些网站上的登录项和本地保存的登录项一样可以填。第一次要用到时,它会让你用主密码解锁管理器——掩码输入框,每个会话一次,闲置 30 分钟后需要重新解锁。主密码是通过管理器的非交互通道递进去的(op signin 走标准输入,bw unlock --passwordenv 走子进程的环境变量),内存里只留一个会话 token。Agent 看不到主密码,看不到 token,也看不到任何一条登录项。
如果一个条目上列了多个网址(例如 amazon.co.uk、www.amazon.co.uk、eu.account.amazon.com),它就会在这几个 origin 上分别命中;除了条目上保存的 URL 之外,不会推断出别的站点。想关掉某个被检测到的管理器,可以用 hermes vault sources --disable bitwarden,或者 Settings → Passwords & Logins 里的开关。
结账时的卡和地址
卡和地址跟登录项是同一套存法:存一次(Settings → Passwords & Logins → Add,或 hermes vault add),绑定到结账站点,只在这个站点上填。区别在于每一次填卡都会先问你,用的是和危险命令一样的审批提示;你拒绝,就等于什么都没写。cron、webhook、API server 这类无人应答的会话没法确认,会被直接拒绝——所以即使一条提示注入把 Agent 带到了结账页,它能发起请求,但花不出去钱。地址填充不需要确认。
存了什么、存在哪里、什么时候用不了
- Desktop:Settings → Passwords & Logins,列出全部已存条目、检测到的管理器(带 Unlock / Lock)、Add 和 Remove。
- 命令行:
hermes vault list、hermes vault add、hermes vault rm(后面跟条目的 handle)、hermes vault sources。 - 落盘位置:条目加密存在
~/.hermes/vault/(Fernet key 和 vault 文件,权限均为 0600),按 profile 隔离;标签、站点 origin、登录标识是可以看到的元数据;密码和卡片内容除了注入页面以外不会离开 vault。存储密钥本身的加密方式见 keychain 密钥加密指南。 - 无人值守会话:cron、webhook、API server、
hermes chat -q都没人能应答提示。已保存的本地登录继续可用;被锁住的密码管理器返回unavailable_in_this_session,找不到登录项返回prompt_unavailable。解决办法是先在有人的会话里解锁或保存,或者给 1Password 配一个 service account token(OP_SERVICE_ACCOUNT_TOKEN)。
配置项长这样:
vault:
onepassword:
enabled: false # 关掉被检测到的 1Password(默认:装了就是开的)
account: "" # `op --account` 简写;留空表示默认账号
service_account_token_env: OP_SERVICE_ACCOUNT_TOKEN
bitwarden:
enabled: false
它保证什么,不保证什么
保证:密码不会经由 Hermes 进入模型的上下文——工具结果、日志、会话数据库、以及任何进程的命令行参数里都没有;填充走的是受控浏览器会话的直连 CDP socket,而且页面 origin 必须与保存时的 origin 完全一致才允许填,写入前还会在页面内部再核对一次。
不保证:挡不住页面本身。密码一旦被打进某个网站,这个网站和它运行的脚本就拿到了它,和你自己手输时完全一样;如果用的是云端浏览器后端,服务商的浏览器看到的页面和平时没有区别。origin 绑定防的是「填到错误的站点」,不是「正确的站点被攻破」。云端与本地的取舍可以看云浏览器回退那篇。
Agent 实际调用的是 browser_vault 系列工具:browser_vault_list、browser_vault_fill、browser_vault_save_login、browser_vault_enter_code。这个能力随 v0.22.0「The Threshold Release」发布(tag v0.22.0,2026 年 10 月 13 日)。想先看它的来龙去脉,可以读之前那篇浏览器凭据自动填充的介绍。