← 返回所有文章

桌面 SSH 工具的密码管理:把连接密码统一放进 macOS 钥匙串

每个连接各自存一份密码,早晚会变成一场迁移灾难。这篇记录把 SSH 连接密码统一收敛进 macOS 钥匙串的设计:共享缓存、集中迁移、断点续传,以及为什么必须读回核验之后才清理旧条目。

做桌面 SSH 工具,密码管理是绕不过去的一课。

最省事的做法是每个连接各自带一份密码存在配置里。短期没问题,长期一定是灾难:换机器、重装、想分享一份连接配置给同事,每一次都要面对「密码散落在几十个连接里」的现实。更糟的是导出配置做备份的时候,凭据会跟着一起出去。

原则:交给系统,不要自造

我的原则很简单:桌面工具的敏感凭据应该交给操作系统级的安全存储。在 Mac 上就是钥匙串(Keychain)。它有系统级的加密、解锁策略和授权提示,任何自造的加密文件都很难在这些问题上做得更好。

所以 Docklark 的方向是把连接密码统一收敛成一个 SSH 密码库,实体存进 macOS 钥匙串,而不是各自为政的连接字段。

内存缓存:别让钥匙串弹窗追着用户跑

钥匙串每次被访问都可能弹授权。多窗口、多连接的客户端如果每次取密码都去读钥匙串,体验会碎成渣。

所以密码库在钥匙串之上加了一层共享内存缓存:多个窗口、多条连接共用同一份缓存,授权一次,会话内不再打扰。密码的增删改都经过这层缓存,再落到钥匙串。

迁移才是最难的部分

真正难的不是存储,是迁移:已有连接里各自保存的旧密码,要集中搬进新的统一密码库。

Docklark 把迁移做成一个显式的集中过程,并且支持断点续传:中途失败(比如钥匙串被锁、某个条目暂时读不出来)不会推倒重来,修好后从上次的位置继续。

最重要的一条规则是读回核验:把一个密码写进新库后,要把它读回来和旧条目比对,核验通过之后才清理旧的保存位置。多做一次读回核验,可以降低「迁移显示成功但密码丢了」的风险,但不能代替完整的迁移测试。

密钥是另一条线

密码之外还有密钥。Docklark 支持生成 Ed25519、RSA 和 ECDSA 密钥,导入导出 OpenSSH 格式,查看指纹、复制公钥。指纹校验放在显眼的位置,因为导入密钥时最容易出的错就是拿错文件。

同时,Docklark 自己的 JSON 连接配置导入导出永远不包含凭据。配置可以随手分享和备份,密码和密钥永远留在钥匙串和密钥库里。

边界

统一密码库还在验收中:跨安装版本的钥匙串迁移、锁定钥匙串时的交互、系统授权弹窗,以及用新密码库跑真实 SSH 登录,都还在清单上。验证完成之前,我不会说它稳了。进展照旧同步在 Docklark 项目页。

感谢阅读。

继续探索更多文章 →