Skip to content

0x3ea/KeyForge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

KeyForge

基于 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))
  1. Argon2id 对主密码做密钥派生,salt 由网站名和用户名的长度前缀编码组成,避免字段内容包含分隔符时发生碰撞
  2. 派生出的字节通过拒绝采样映射到可打印字符集,消除模偏差
  3. 生成的密码复制到剪贴板,并在超时后自动清除

安全设计

  • 主密码不存储 — 仅在内存中使用,用完后清零
  • 确定性生成 — 无需数据库,不落盘
  • 拒绝采样 — 编码时消除模偏差
  • 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 ./... -v

项目结构

keyforge/
├── 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 无回显密码输入

License

MIT

About

基于 Argon2id 的确定性密码生成器

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors