面向 AI 编程工具的本地密码代填 CLI。凭据加密存本地,AI 只写 {{占位符}},pwhide 注入真实密码执行,并把输出自动脱敏。
六个安全不变量约束全部实现,完整威胁模型随代码开源。
没有任何查看密码的命令;输出流式脱敏后才返回;密码只进子进程、不出终端。
弱密码("密码=常见语句")录入即拒;回显探测命令拦截;输出高频碰撞告警。被脱敏的位置在输出里依然是占位符,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 后四条命令上手:
从录入到 AI 日常使用的完整路径。
set 交互式隐藏输入;-f 字段=值 添加自定义字段(api_key 等敏感字段用 -f 字段名 交互输入,避免进 shell history);非交互场景用 --password-stdin 管道传入。弱密码会被直接拒绝。
{{db}} 密码、{{db.user}} 账号、{{db.tenant}} 租户、{{db.字段名}} 自定义字段值。条目名可用 list 查到,密码没有查询接口。
args 内联最直观但 ps 短暂可见;--env 条目:环境变量 注入环境(注意 Linux 祖先进程可读 /proc);推荐脚本 stdin 模式:脚本里写占位符,pwhide exec -f deploy.sh,替换只在内存发生,不落盘不进 argv。
0 成功(透传子进程码);2 用法错误或回显探测拦截;3 口令或 vault 错误、需提权;4 未知占位符(命令不会被执行);124 超时已杀进程树。
doctor 检查保护状态并恢复中断;rotate 更换密钥对;口令自动化用 PWHIDE_PASSPHRASE_FILE(600 权限文件)。密码含 shell 元字符时 pwhide 会告警并建议改用 --env。
把这段契约粘贴进项目的 AGENTS.md / CLAUDE.md,或安装仓库内置 Skill(skills/pwhide/install.sh):
六条不变量贯穿全部实现;诚实的边界声明见仓库 threat-model.md。
| 不变量 | 含义 |
|---|---|
| I1无明文输出 | 不存在 get/show 类命令,元数据可查、密文不可查 |
| I2未知即拒跑 | 任一占位符未解析则退出码 4,子进程不启动 |
| I3输出脱敏 | 跨缓冲区字节级替换回占位符,是最终防线 |
| I4私钥不出本机 | 密文单独泄露不可解 |
| I5不回显已解析命令 | 错误、日志只含占位符版本 |
| I6只整体覆盖 | 加固后 vault 变更走唯一受控路径,exec 读路径永不提权 |
诚实声明是这个项目的一部分。
密码经 pwhide 注入子进程,父 shell、对话、history 里只有占位符;就算命令把密码打到输出,pwhide 也会替换回占位符后才给 AI 看。
三道闸:弱密码录不进来(常见语句会被拒);echo、printf 探测命令直接拒绝(--allow-echo 显式放行);单条命令输出中密码出现超 32 次会告警。防的是意外泄露,恶意 Agent 主动编码外传属声明边界(见威胁模型)。
支持(win-x64 / win-arm64 二进制,pwsh 路径全绿)。cmd 语法特殊,建议 pwsh;PowerShell 5.1 的编码陷阱已内置规避。
无法恢复。没有后门,这是设计。可先 list(元数据不需要口令)导出清单,重新 init 录入。
MIT 开源,免费。二进制从 GitHub Releases 获取,附 SHA256 校验和。