标签:CLI工具 · 开发工具 · 安全 · Rust · 开源
背景:你的密钥现在在哪?
做了几年开发,积累了一堆 API Key:
OPENAI_API_KEY=sk-xxx
GITHUB_TOKEN=ghp_xxx
CLOUDFLARE_API_TOKEN=xxx
STRIPE_SECRET_KEY=sk_live_xxx
它们分散在:
- 10 个项目的
.env文件里 - Notion 某个角落的笔记里
- iMessage 发给自己的消息里
- 甚至直接硬编码在某个早期项目里……
换了新电脑?去翻旧备份。密钥过期了?不知道是哪个项目在用。.env 文件不小心提交到了 Git?凌晨两点改密码。
这个痛点困扰了我很久,直到我做了 keyflow。
keyflow 是什么
一个本地优先的开发者密钥管理器:
- AES-256-GCM 加密存储,主密码不落盘
- 项目感知:自动识别当前目录属于哪个项目,
kf run只注入相关的 key - MCP 集成:Claude、Cursor 等 AI 工具可以直接读取密钥(只暴露元数据,不暴露值)
- 云同步:端到端加密,服务端看不到明文
- 跨平台:macOS / Linux / Windows
5 分钟上手
安装:
# macOS(推荐)
brew install nianyi778/keyflow/keyflow
# 或通过 cargo
cargo install keyflow
初始化:
kf init
# 按提示设置主密码,vault 创建完成
添加密钥:
kf add OPENAI_API_KEY "sk-xxxxx"
kf add GITHUB_TOKEN "ghp_xxxxx" --project my-app
kf add STRIPE_SECRET_KEY --paste # 直接从剪贴板读取,值不经过 shell history
使用密钥:
# 查看值
kf get OPENAI_API_KEY
# 注入到命令运行(最常用)
kf run -- npm start
kf run -- python main.py
kf run -- docker compose up
# 复制到剪贴板
kf get OPENAI_API_KEY --copy
几个我最喜欢的功能
1. 自动项目识别
kf run 会读取当前目录的 package.json 或 Cargo.toml,自动匹配 --project 标签,只注入相关的 key。不会把 Stripe 的生产密钥注入到个人实验项目里。
# 在 my-app 目录下
kf run -- npm start
# 只注入 --project my-app 的密钥
# 想注入全部
kf run --all -- npm start
2. MCP 集成(AI 编程提效)
配置一次,Claude Code / Cursor / Windsurf 就能感知你的密钥库:
kf setup claude # 自动写入 Claude Code 的 MCP 配置
kf setup cursor # 自动写入 Cursor 配置
kf setup --all # 一次配置所有检测到的工具
配置完后,AI 工具知道你有哪些 key、属于哪些项目——不用每次手动粘贴环境变量,让 AI 帮你写代码时它自己知道调用什么。
3. 云同步 + 冲突策略
在公司电脑和家里电脑之间同步,端到端加密:
kf sync init # Google 登录授权(只做一次)
kf sync run # 双向同步
同步遇到两端都修改了同一个 key?v0.7.0 新增了冲突解决策略,不再无脑覆盖:
kf sync pull --strategy ask # 有冲突时逐条让你选
kf sync pull --strategy local # 本地优先
kf sync pull --strategy cloud # 云端优先(默认)
交互式选择长这样:
⚡ Conflict: OPENAI_API_KEY
Local (2025-03-30 10:00): sk-ab••••yz
Cloud (2025-03-31 09:15): sk-NE••••bc
Keep [l]ocal / [c]loud / [s]kip?
4. 健康检查
kf health
一眼看出哪些 key 即将过期、多久没用过、没有绑定项目——做密钥审计再也不用翻 .env。
5. 一键升级
kf upgrade
# 自动检测安装方式(Homebrew / cargo),找到就升级
安全设计
几个容易忽略但很重要的细节:
主密码不落盘
只缓存在内存,进程结束或 kf lock 后立即清除。
kf lock # 立即清除缓存,下次操作重新输入密码
sync 双重加密
push 到云端前,数据会用主密码加密一次,再用独立的 sync_salt 加密一次。即使服务器被攻破,攻击者拿到的是双重密文。
MCP 只暴露元数据
AI 工具通过 MCP 只能知道你有 OPENAI_API_KEY、它属于哪个项目、什么时候创建的——拿不到值本身。
冲突日志脱敏
sync-conflicts.jsonl 里存的是 sk-ab••••yz 这样的 masked 值,不存完整密钥,.jsonl 文件不会成为新的泄露点。
对比同类工具
| keyflow | 1Password CLI | dotenv-vault | direnv | |
|---|---|---|---|---|
| 本地优先 | ✅ | ❌(云服务) | ❌ | ✅ |
| 完全免费开源 | ✅ | ❌ | 有限制 | ✅ |
| MCP 集成 | ✅ | ❌ | ❌ | ❌ |
| 项目感知注入 | ✅ | ❌ | ✅ | ✅ |
| 云同步 | ✅ | ✅ | ✅ | ❌ |
| 加密存储 | ✅ | ✅ | ✅ | ❌ |
技术栈
用 Rust 写的,单二进制,无运行时依赖:
- 加密:
aes-gcm+argon2(AES-256-GCM + Argon2id) - 存储:SQLite(
rusqlite,bundled 模式,零安装) - CLI:
clapv4 derive 模式 - 云同步:Cloudflare Workers(可自托管)
release 包大小约 2-3MB,启动时间 < 10ms。
未来计划
- Web UI(可视化管理密钥)
- 团队共享 vault
- 更多 AI 工具集成(Gemini CLI、OpenCode 等)
- 密钥自动轮换提醒
在哪里找到它
- GitHub:nianyi778/keyflow
- 安装:
brew install nianyi778/keyflow/keyflow
brew install nianyi778/keyflow/keyflow
kf init
如果你也被散落的 .env 文件折磨过,欢迎试试。Star、Issue、PR 都欢迎——因为信任所以简单。