三个开源项目,一个安全闭环:当国密密码管理器、命令密封和邮件Agent走到一起
zhmm → cmdseal → agentpost:从安全存储到安全执行,再到远程遥控,恰好走完一圈。
缘起
最近我在 GitHub 上陆续开源了三个项目:zhmm(国密密码管理器)和 cmdseal(命令密封工具)。做它们的初衷很简单:我想让 AI Agent 能用上我的密码,但又不能看到我的密码。
这是个有点拧巴的需求——既要放权,又要保密。传统的做法要么是写死环境变量(不安全),要么是让 Agent 每次都问我要密码(不现实)。所以我花了一些时间,从底层开始搭了一套「信任链」出来。
但做到 cmdseal 之后,我发现还缺一块拼图。
有了密码管理(zhmm),有了安全执行(cmdseal),但 Agent 怎么接收我的指令呢?总不能每次都 SSH 进机器吧?尤其是我在外面的时候,想给家里的 Agent 派个活,还得掏电脑连 VPN,太麻烦了。
所以就有了第三个项目——agentpost。
这三个项目放在一起,恰好构成一个闭环。我想跟你聊聊这个闭环是怎么设计的。
第一环:zhmm —— 信任的起点
zhmm 做的是最基础也最重要的事:把密码管好。
但它不是又一个密码管理器。zhmm 有几个不一样的设计:
国密算法,本地优先
zhmm 使用中国国家密码标准 SM3(哈希)和 SM4(对称加密) 作为核心加密算法,配合 Argon2id 进行密钥衍生。密库是一个单文件,存在本地,不上云。
这意味着什么?你的密码数据库就是一个小文件,可以随身带走,也可以备份到任何地方,没有厂商锁。
双形态:GUI + CLI
zhmm 同时提供了 PyQt6 图形界面 和 命令行接口。日常管理密码用 GUI,但在脚本里查询密码、做自动化集成时,CLI 就派上用场了——这也为后面 cmdseal 的集成埋下了伏笔。
1 | # 命令行查询密码 |
安全细节
- TOTP 双因子认证:内置一次性密码生成器,不用单独装 Google Authenticator
- 防截屏:GUI 模式下屏蔽截屏,防止密码被恶意录制
- 自动锁定:闲置一段时间自动锁库
zhmm 是整个体系的 “根信任”。所有的 API Key、数据库密码、加密口令,都在这里统一管理。
第二环:cmdseal —— 让 AI 用密码,但看不到密码
有了密码管理器,下一个问题来了:怎么让 AI Agent 安全地使用这些密码?
直接告诉 Agent?不可能。把密码写到配置文件里?不安全。让 Agent 每次执行都去问用户?不现实。
cmdseal 的解决方案很巧妙:把「命令模板 + 机密值」打包成一个独立的二进制文件,这个二进制只能执行它被密封的那条命令,而运行它的人(或 AI)拿不到机密本身。
怎么做到的?
核心是三层保护:
- AEAD 加密:机密值在 seal(密封)时用密钥加密,嵌入二进制中。运行时会解密注入到命令中,但不会暴露给外部。
- macOS Keychain ACL:密钥存在 Keychain 里,并通过 ACL(访问控制列表)绑定到该二进制的 cdhash(代码目录哈希)。
- cdhash 绑定:只有特定哈希值的二进制才能从 Keychain 中取出密钥。这意味着,就算有人复制了这个二进制,改了它,也无法运行。
举个栗子
假设你想让 AI Agent 能帮你解压一个加密的 zip 文件:
1 | # 1. 密封命令:把密码嵌入二进制 |
Agent 运行 ./sealed_unzip 时,它解压了文件,但密码就像从来没出现过一样——因为它只在内存中短暂存在,然后就被销毁了。
应用场景
- AI Agent 执行数据库备份:Agent 调用密封的
mysqldump,不需要知道数据库密码 - API 调用:密封的
curl命令,Token 内置,Agent 不可见 - CI/CD 流水线:在构建脚本中使用密封命令,避免密钥泄露
cmdseal 是 “能力门卡”——AI Agent 拿到了执行某件事的能力,但拿不到背后的密钥。这是最小权限原则(Principle of Least Privilege)在 Agent 时代的落地。
第三环:agentpost —— 给家里的 AI Agent 寄信
有了密码管理(zhmm),有了安全授权(cmdseal),但还有最后一个问题:怎么跟 Agent 通信?
我想要的场景很简单:我在外面用手机,发一封邮件,家里的 AI Agent 收到后自动执行任务。
这就是 agentpost 做的事。
设计理念
agentpost 是一个 Android 应用,它的核心逻辑是:
- 通过 IMAP 协议 轮询指定邮箱,读取新邮件
- 解析邮件内容,识别任务指令
- 调用本地的 cmdseal 密封命令(或其他工具)执行任务
- 通过 SMTP 协议 发送执行结果回执
关键选择:使用标准邮件协议,而不是自建通信通道。
为什么?
- 邮件是通用的,任何邮箱都能用(QQ 邮箱、Gmail、Outlook 等)
- 不需要公网 IP、不需要服务器中转、不需要配置复杂的网络穿透
- 手机端发邮件就是原生体验,不需要额外装 App 来发指令(虽然 agentpost 本身就是个 Android App)
截图预览
agentpost 的使用流程主要分为三部分:邮箱设置、任务管理与任务详情查看。
邮箱设置(中/英文界面):
配置 IMAP/SMTP 邮箱参数,支持 SSL/TLS 加密连接,所有邮箱凭证存储在本地,不会上传云端。
新建任务(中/英文界面):
填写任务名称、执行指令、目标设备等信息。指令支持模板变量,可结合 cmdseal 使用。
任务列表与任务详情:
所有已创建的任务一目了然,支持状态筛选(待执行/执行中/已完成/失败),点击可查看详细执行日志。
工作流
1 | 你(手机发邮件) |
安全考量
有人可能会问:邮件本身安全吗?
这是个好问题。Agent的命令邮件中包含敏感信息怎么办?agentpost 的设计中考虑了几点:
- 邮件内容加密:可以使用 PGP/GPG 对邮件正文加密,agentpost 解密后执行
- 白名单发件人:只处理来自白名单邮箱的指令
- 结合 cmdseal:真正敏感的操作(如涉及密码的命令)由 cmdseal 处理,邮件本身不传递明文密码
闭环:从密码到执行再到远程控制
现在把三个项目串起来看:
1 | ┌──────────────────────────────────────────────────────┐ |
这是一个 完整的信任链闭环:
- zhmm 统一管理所有密码和密钥,提供安全的存储和查询能力
- cmdseal 从 zhmm 获取密钥,封装成安全的执行单元,交给 AI Agent
- agentpost 提供远程通信渠道,让你用邮件给 Agent 下达任务
- Agent 执行 cmdseal 密封命令完成任务,结果通过 agentpost 反馈给你
闭环的价值不在于单个工具的强弱,而在于 各环节之间的信任关系是完整的、可验证的。
一些思考
为什么选邮件协议?
在 agentpost 之前,我考虑过 MQTT、WebSocket、甚至自己搭一个消息服务器。但最终选择了邮件,原因很简单:邮件是互联网上最普适的异步通信协议。它不需要心跳连接,不需要公网 IP,不会被 NAT 阻断,而且几乎每个人都会用。
当然,邮件有延迟(IMAP 轮询间隔通常在几十秒到几分钟),但对于「给家里的 Agent 派活」这个场景来说,异步通信完全够用。
为什么做三个项目而不是一个?
坦白说,三个项目完全可以合并成一个 All-in-One 的工具。但我不喜欢那样做。
分离的好处是:
- 每个工具职责单一:zhmm 只管密码,cmdseal 只管安全执行,agentpost 只管通信
- 可以独立使用:你可以只拿 zhmm 当密码管理器,也可以只拿 cmdseal 做 CI/CD 密钥保护
- 组合灵活:agentpost 不一定非要配合 cmdseal,它也可以调用其他本地工具
下一步
agentpost 目前是 Android 端,因为我的主力机是 Android。如果能有人帮忙做个 iOS 版本,或者直接用邮件客户端 + 快捷指令也能达到类似效果,那就是这个项目最好的状态——成为一个范式,而不仅仅是一个 App。
项目地址
欢迎 Star、Issue 和 PR:
- 🔒 zhmm — 国密密码管理器(SM3/SM4 + Argon2id + TOTP)
- 🛡️ cmdseal — 命令密封工具(AEAD + Keychain ACL + cdhash)
- 📧 agentpost — 邮件远程指令(Android + IMAP/SMTP)
如果你对这三个项目感兴趣,或者有自己的 AI Agent 安全方案想聊聊,欢迎在 GitHub 上找我。




