让 AI 执行带密码的命令,
密码却永远隐形

面向 AI 编程工具的本地密码代填 CLI。凭据加密存本地,AI 只写 {{占位符}},pwhide 注入真实密码执行,并把输出自动脱敏。

AES-256-GCM + RSA-3072 信封加密 macOS / Linux / Windows Native AOT 单文件 MIT 开源

核心特性

六个安全不变量约束全部实现,完整威胁模型随代码开源。

零上下文泄露

没有任何查看密码的命令;输出流式脱敏后才返回;密码只进子进程、不出终端。

防猜密码三道闸

弱密码("密码=常见语句")录入即拒;回显探测命令拦截;输出高频碰撞告警。被脱敏的位置在输出里依然是占位符,AI 无从比对猜测,这条旁路被全程封堵。

特权加固

root 属主 + 不可变标志,vault 只能整体覆盖;提权安装只搬运密文,且经符号链接、属主、inode 三重校验,三类真实攻击经 Docker 环境对抗验证。

三种执行模式

脚本 stdin(推荐,密码不进 argv 与 environ)> 环境变量注入 > args 内联。包装 bash / sh / pwsh / cmd 四种 shell。

扩展条目模型

账号类型、账号、密码、租户、自定义字段。元数据可查(AI 组装命令用),密码与字段值不可查,list --json 是 AI 的主查询接口。

工程级质量

187 个测试(单元 + 集成),CI 三平台(含真实 sudo 的加固流程),22 轮 3-Agent 安全评审收敛,六平台 Native AOT 产物附 SHA256 校验和。

快速上手

Releases 下载对应平台二进制(或仓库 dist/ 目录,附校验和),放进 PATH 后四条命令上手:

# 1. 初始化(设置主口令;基础模式 目录700/文件600) pwhide init # (建议)启用管理员级写保护:文件只能整体覆盖 pwhide harden # 2. 录入凭据(人类操作;密码隐藏输入) pwhide set db -t database -u root -T prod -f host=127.0.0.1 # 3. 查询可用凭据(元数据,无任何密文) pwhide list --json # 4. 代理执行,AI 只写占位符 pwhide exec --env db:MYSQL_PWD -- mysql -u {{db.user}} -e "SELECT 1"

五分钟教程

从录入到 AI 日常使用的完整路径。

01

录入凭据

set 交互式隐藏输入;-f 字段=值 添加自定义字段(api_key 等敏感字段用 -f 字段名 交互输入,避免进 shell history);非交互场景用 --password-stdin 管道传入。弱密码会被直接拒绝。

02

了解占位符语法

{{db}} 密码、{{db.user}} 账号、{{db.tenant}} 租户、{{db.字段名}} 自定义字段值。条目名可用 list 查到,密码没有查询接口。

03

三种执行方式按安全性递增

args 内联最直观但 ps 短暂可见;--env 条目:环境变量 注入环境(注意 Linux 祖先进程可读 /proc);推荐脚本 stdin 模式:脚本里写占位符,pwhide exec -f deploy.sh,替换只在内存发生,不落盘不进 argv。

04

看懂退出码

0 成功(透传子进程码);2 用法错误或回显探测拦截;3 口令或 vault 错误、需提权;4 未知占位符(命令不会被执行);124 超时已杀进程树。

05

日常维护

doctor 检查保护状态并恢复中断;rotate 更换密钥对;口令自动化用 PWHIDE_PASSPHRASE_FILE(600 权限文件)。密码含 shell 元字符时 pwhide 会告警并建议改用 --env

接入你的 AI 工具

把这段契约粘贴进项目的 AGENTS.md / CLAUDE.md,或安装仓库内置 Skill(skills/pwhide/install.sh):

当需要执行包含密码的命令时: 1. 永远不要向用户索要真实密码,用 {{条目名}} 占位; 2. 不确定有哪些凭据可用时,先 `pwhide list --json` 查询(可见:账号类型、 账号、租户、自定义字段名;不可见:密码与字段值); 3. 通过 `pwhide exec -- <命令>` 执行,pwhide 会自动填充并返回结果; 4. 报"未知条目"(退出码 4)时,请用户本人运行 `pwhide set <名字>` 录入; 5. 不要构造 echo 回显占位符的命令(会被拒绝),也不要尝试推测密码内容; 6. 录入弱密码(常见口令、常见语句)会被拒绝,请引导用户设置强密码。

安全模型一图流

六条不变量贯穿全部实现;诚实的边界声明见仓库 threat-model.md

不变量含义
I1无明文输出不存在 get/show 类命令,元数据可查、密文不可查
I2未知即拒跑任一占位符未解析则退出码 4,子进程不启动
I3输出脱敏跨缓冲区字节级替换回占位符,是最终防线
I4私钥不出本机密文单独泄露不可解
I5不回显已解析命令错误、日志只含占位符版本
I6只整体覆盖加固后 vault 变更走唯一受控路径,exec 读路径永不提权

常见问题

诚实声明是这个项目的一部分。

和直接把密码写进命令有什么区别?

密码经 pwhide 注入子进程,父 shell、对话、history 里只有占位符;就算命令把密码打到输出,pwhide 也会替换回占位符后才给 AI 看。

AI 会不会通过输出猜出密码?

三道闸:弱密码录不进来(常见语句会被拒);echo、printf 探测命令直接拒绝(--allow-echo 显式放行);单条命令输出中密码出现超 32 次会告警。防的是意外泄露,恶意 Agent 主动编码外传属声明边界(见威胁模型)。

支持 Windows 吗?

支持(win-x64 / win-arm64 二进制,pwsh 路径全绿)。cmd 语法特殊,建议 pwsh;PowerShell 5.1 的编码陷阱已内置规避。

忘掉主口令怎么办?

无法恢复。没有后门,这是设计。可先 list(元数据不需要口令)导出清单,重新 init 录入。

费用与许可?

MIT 开源,免费。二进制从 GitHub Releases 获取,附 SHA256 校验和。