基于 Argon2id 的确定性密码生成器。通过主密码 + 站点名派生唯一密码,不存储任何状态。
- 确定性生成 — 相同输入永远产生相同密码,无需数据库
- 不存储状态 — 没有密码文件,没有云同步,没有泄漏风险
- Argon2id — 抗 GPU/ASIC 的业界标准 KDF
- 拒绝采样 — 消除模偏差,确保字符均匀分布
- 剪贴板自动清除 — 复制后自动清空,防止密码残留
- 二次确认 — 首次输入主密码需确认,防止输错
- JSON 配置 — 全局默认值 + 站点级覆盖,命令行参数优先
- 跨平台 — 支持 Linux / macOS / Windows
git clone https://github.com/0x3ea/KeyForge.git
cd KeyForge
make build或手动编译:
go build -o keyforge .# 基本用法:交互式输入主密码,密码复制到剪贴板
keyforge github.com
# 指定用户名
keyforge github.com -u 0x3ea
# 指定密码长度
keyforge github.com -l 16
# 打印到终端(不复制到剪贴板)
keyforge github.com -p
# 自定义剪贴板清除时间(秒),0 为禁用
keyforge github.com -t 30
# 组合使用
keyforge github.com -u 0x3ea -l 20 -t 60| 参数 | 缩写 | 默认值 | 说明 |
|---|---|---|---|
--username |
-u |
空(可配置) | 站点用户名,用于生成唯一 salt |
--print |
-p |
false(可配置) | 打印密码到终端(默认复制到剪贴板) |
--length |
-l |
16(可配置) | 密码长度(1-32) |
--timeout |
-t |
45(可配置) | 剪贴板自动清除秒数(0 禁用) |
--symbols |
-s |
false(可配置) | 包含符号字符 |
KeyForge 支持 JSON 配置文件,路径遵循系统标准:
- Linux:
~/.config/keyforge/config.json - macOS:
~/Library/Application Support/keyforge/config.json - Windows:
%APPDATA%\keyforge\config.json
首次运行时自动创建配置目录和默认配置文件。
{
"defaultUserName": "",
"defaultLength": 16,
"defaultSymbols": false,
"defaultTimeout": 45,
"defaultPrint": false,
"sites": {
"github.com": {
"userName": "0x3ea",
"length": 20,
"symbols": false
},
"work.example.com": {
"userName": "workuser",
"length": 24,
"symbols": true
}
}
}优先级:命令行显式参数 > 站点配置 > 全局默认值
例如配置了 sites.github.com.userName = "0x3ea" 后,直接运行 keyforge github.com 即可,无需每次传 -u。
密码 = Encode(Argon2id(主密码, salt=len(网站名):网站名len(用户名):用户名, time=3, memory=64MB, threads=4, keyLen=64))
- 用 Argon2id 对主密码做密钥派生,salt 由网站名和用户名的长度前缀编码组成,避免字段内容包含分隔符时发生碰撞
- 派生出的字节通过拒绝采样映射到可打印字符集,消除模偏差
- 生成的密码复制到剪贴板,并在超时后自动清除
- 主密码不存储 — 仅在内存中使用,用完后清零
- 确定性生成 — 无需数据库,不落盘
- 拒绝采样 — 编码时消除模偏差
- Salt 长度前缀 — 用长度前缀编码 site 和 username,防止分隔符碰撞
- 剪贴板优先 — 默认复制到剪贴板,避免终端历史泄露
- 自动清除 — 剪贴板内容在超时后自动清空,且不会覆盖用户新复制的内容
make build-linux # Linux amd64
make build-windows # Windows amd64
make build-darwin-amd64 # macOS Intel
make build-darwin-arm64 # macOS Apple Silicon
make build-all # 全平台make test
# 或
go test ./... -vkeyforge/
├── main.go # 入口
├── cmd/ # CLI 命令
│ ├── root.go # 主命令 & 参数处理
│ ├── term.go # 安全密码输入(二次确认)
│ └── cmd_test.go # 命令层测试
├── internal/
│ ├── config/
│ │ ├── config.go # JSON 配置加载 & 站点覆盖
│ │ └── config_test.go
│ ├── crypto/
│ │ ├── crypto.go # Argon2id 密钥派生
│ │ └── crypto_test.go
│ ├── encode/
│ │ ├── password.go # 拒绝采样编码
│ │ └── password_test.go
│ └── clipboard/
│ ├── clipboard.go # 剪贴板写入 & 自动清除
│ └── clipboard_test.go
├── integration_test.go # 集成测试
├── Makefile
├── go.mod
└── go.sum
| 组件 | 技术 | 说明 |
|---|---|---|
| 语言 | Go | 编译为单二进制,跨平台分发 |
| 密钥派生 | golang.org/x/crypto/argon2 |
Argon2id,抗 GPU/ASIC |
| CLI 框架 | github.com/spf13/cobra |
Go 生态主流 CLI 框架 |
| 剪贴板 | github.com/atotto/clipboard |
支持 X11/Wayland |
| 终端输入 | golang.org/x/term |
无回显密码输入 |
MIT