一、什么是 pass
pass 自称为 “The Standard Unix Password Manager”(标准 Unix 密码管理器),由 Jason A. Donenfeld(zx2c4)开发。它遵循经典的 Unix 哲学:只做一件事,并把它做好。
pass 的核心设计极其简洁:每个密码都是一个独立的 gpg 加密文件,文件名即服务名称,所有文件存放在 ~/.password-store 目录下,形成一棵清晰的目录树。
这意味着你可以用任何标准的 Unix 工具来操作密码库——ls、grep、find、cp、mv、git 全部适用。没有专有数据库格式,没有复杂的 GUI,只有 GPG 加密的安全性和文件系统的灵活性。
二、核心架构与设计理念
pass 的架构可以用三个关键词概括:GPG 加密、文件系统存储、Git 版本控制。
graph TD
subgraph "用户层"
U[用户输入]
CLI[pass CLI]
end
subgraph "加密层"
GPG[GPG 加密/解密]
KEY[GPG 私钥]
end
subgraph "存储层"
FS[文件系统<br/>~/.password-store]
GIT[Git 仓库]
REMOTE[远程仓库<br/>GitHub/GitLab/自建]
end
U -->|pass insert/show| CLI
CLI -->|加密| GPG
CLI -->|解密| GPG
GPG -->|依赖| KEY
GPG -->|写入 .gpg 文件| FS
FS -->|版本追踪| GIT
GIT -->|推送/拉取| REMOTE
2.1 存储结构
密码库本质上就是一个普通目录:
graph LR
subgraph "~/.password-store"
ROOT[.gpg-id]
GITHUB[github/]
WORK[work/]
BANK[bank/]
end
ROOT -->|定义加密密钥| GPG_KEY[GPG Key ID]
GITHUB --> GP[personal.gpg]
GITHUB --> GW[work.gpg]
WORK --> W1[printer.gpg]
WORK --> W2[vpn.gpg]
BANK --> B1[credit-card.gpg]
每个 .gpg 文件都是独立加密的文本文件,第一行是密码,后续行可以存储用户名、URL、备注等元数据。
三、安装与初始化
3.1 安装
pass 已被所有主流发行版收录:
# Debian/Ubuntu
sudo apt-get install pass
# Fedora
sudo dnf install pass
# macOS
brew install pass
# Arch Linux
sudo pacman -S pass
3.2 生成 GPG 密钥
pass 依赖 GPG 进行加密,首先需要生成或准备一对 GPG 密钥:
gpg --full-generate-key
# 选择 RSA and RSA,4096 位,设置姓名、邮箱和强密码
查看密钥 ID:
gpg --list-secret-keys --keyid-format=long
# sec rsa4096/0D73297D7CB939CC 2024-01-01 [SC]
# ^^^^^^^^^^^^^^^^^^^^^^^^ 这就是 Key ID
3.3 初始化密码库
pass init "0D73297D7CB939CC"
# 或按邮箱/名称
pass init "Your Name <you@example.com>"
这会创建 ~/.password-store 目录,并在其中写入 .gpg-id 文件,记录用于加密的 GPG 密钥标识。
四、日常使用:CRUD 操作
4.1 新增密码
手动输入:
pass insert github/personal
# 提示输入密码并确认
自动生成强密码:
pass generate github/work 20
# 生成 20 位随机密码,包含字母、数字和符号
多行内容(密码 + 元数据):
pass insert -m bank/credit-card
# 第一行:密码
# 第二行:卡号
# 第三行:CVV
# 第四行:有效期
4.2 读取密码
# 直接显示
pass github/personal
# 复制到剪贴板(45 秒后自动清除)
pass -c github/personal
# 查看多行内容
pass show github/personal
4.3 列出密码树
pass
# 或
pass ls
输出示例:
Password Store
├── bank
│ ├── credit-card
│ └── savings
├── github
│ ├── personal
│ └── work
└── work
├── printer
└── vpn
4.4 编辑与删除
# 编辑(会自动解密到临时文件,保存后重新加密)
pass edit github/personal
# 删除
pass rm github/personal
# 移动/重命名
pass mv github/personal github/main
五、Git 同步:分布式密码库
pass 原生支持 Git 集成,每次增删改都会自动提交,实现版本控制和跨设备同步。
5.1 启用 Git
cd ~/.password-store
pass git init
pass git remote add origin git@github.com:yourname/password-store.git
pass git push -u --all
5.2 同步流程
sequenceDiagram
participant A as 设备 A
participant R as Git 远程仓库
participant B as 设备 B
A->>A: pass insert work/new-pass
A->>A: 自动 git commit
A->>R: pass git push
B->>R: pass git pull
B->>B: pass show work/new-pass
B->>B: GPG 解密(需私钥)
5.3 多设备同步的安全模型
由于密码文件已经是 GPG 加密的,即使 Git 仓库是公开的,攻击者也无法读取密码内容——他们只能看到目录结构(即你有哪些账户)。因此建议:
- 使用私有仓库(GitHub/GitLab 免费私有仓库即可)
- 避免在路径名中暴露敏感信息(如用
github/personal而非github/alice@email.com)
六、团队协作:共享密码库
pass 支持多 GPG 密钥加密,是小型团队共享凭证的理想方案。
6.1 添加团队成员
# 编辑 .gpg-id,追加新成员的公钥 ID
echo "teammate@company.com" >> ~/.password-store/work/.gpg-id
# 重新加密该目录下所有密码
pass init -p work $(cat ~/.password-store/work/.gpg-id)
6.2 团队架构
graph LR
subgraph "团队密码库"
STORE[.password-store/]
WORK[work/.gpg-id<br/>Alice, Bob, Charlie]
PERSONAL[personal/.gpg-id<br/>Alice only]
end
subgraph "成员 GPG 密钥"
A[Alice 私钥]
B[Bob 私钥]
C[Charlie 私钥]
end
STORE --> WORK
STORE --> PERSONAL
WORK -->|可解密| A
WORK -->|可解密| B
WORK -->|可解密| C
PERSONAL -->|仅可解密| A
每个子目录可以有独立的 .gpg-id,实现细粒度的访问控制。
七、扩展生态
pass 的社区非常活跃,围绕它发展出了丰富的扩展和客户端:
7.1 常用扩展
| 扩展 | 功能 | 安装 |
|---|---|---|
pass-otp |
TOTP 两步验证码生成 | apt install pass-extension-otp |
pass-import |
从 1Password/LastPass/Keepass 导入 | pass import |
pass-update |
批量更新密码 | pass update |
pass-tomb |
将密码库放入加密容器(LUKS/tomb) | pass tomb |
7.2 跨平台客户端
graph LR
subgraph "pass 生态"
CLI[pass CLI<br/>Linux/macOS]
QT[QtPass<br/>Linux/macOS/Windows]
IOS[Pass for iOS<br/>iPhone/iPad]
ANDROID[Password Store<br/>Android]
BROWSER[Browserpass<br/>Chrome/Firefox]
end
CLI -->|Git 同步| CLOUD[(Git 仓库)]
QT -->|Git 同步| CLOUD
IOS -->|Git 同步| CLOUD
ANDROID -->|Git 同步| CLOUD
BROWSER -->|本地调用| CLI
- QtPass:跨平台 GUI,适合非技术用户
- Android Password Store:支持 Git 同步和 OpenKeychain GPG
- Pass for iOS:与 iOS 密码自动填充集成
- Browserpass:浏览器插件,自动填充网页密码
八、安全最佳实践
8.1 GPG 密钥安全
- 使用 4096 位 RSA 或 Ed25519 密钥
- 为 GPG 主密钥设置强密码短语
- 考虑使用硬件安全密钥(YubiKey、Nitrokey)存储 GPG 私钥
- 定期备份 GPG 私钥到离线介质(如 paperkey 生成的二维码)
8.2 密码库安全
graph TD
A[安全威胁] --> B[物理设备丢失]
A --> C[Git 仓库泄露]
A --> D[GPG 密钥泄露]
A --> E[剪贴板残留]
B -->|缓解| F[全磁盘加密<br/>LUKS/BitLocker]
C -->|缓解| G[密码已 GPG 加密<br/>元数据泄露最小化]
D -->|缓解| H[硬件密钥<br/>密钥分离存储]
E -->|缓解| I[pass -c 45秒自动清除<br/>剪贴板管理工具]
8.3 GPG Agent 配置
配置 GPG Agent 缓存时间,平衡安全与便利:
# ~/.gnupg/gpg-agent.conf
default-cache-ttl 28800 # 8 小时
max-cache-ttl 28800
# 重载配置
gpgconf --kill gpg-agent
gpg-agent --daemon
九、完整工作流程示例
flowchart TD
START([开始]) --> INSTALL[安装 pass + GPG]
INSTALL --> GENKEY[生成 GPG 密钥对]
GENKEY --> INIT[pass init 初始化]
INIT --> GIT[pass git init<br/>关联远程仓库]
GIT --> USE{日常使用}
USE -->|新增| INSERT[pass insert/generate]
USE -->|读取| SHOW[pass -c 复制到剪贴板]
USE -->|更新| EDIT[pass edit]
USE -->|删除| RM[pass rm]
INSERT --> AUTO_COMMIT[自动 git commit]
EDIT --> AUTO_COMMIT
RM --> AUTO_COMMIT
AUTO_COMMIT --> SYNC[pass git push/pull<br/>多设备同步]
USE --> TEAM{团队协作?}
TEAM -->|是| ADD_KEY[添加成员 GPG 公钥<br/>pass init 重新加密]
TEAM -->|否| END([结束])
ADD_KEY --> SYNC
SYNC --> END
十、优缺点总结
优点
- 极简 Unix 哲学:无专有格式,纯文本 + GPG + 文件系统
- 完全离线:不依赖任何第三方云服务
- 透明可审计:每个密码是独立加密文件,可手动
gpg -d解密验证 - Git 原生支持:版本历史、分支、diff、团队协作一应俱全
- 跨平台生态:CLI、GUI、移动端、浏览器插件全覆盖
- 免费开源:GPLv3 协议,社区活跃
缺点
- GPG 学习曲线:新手需要理解公钥/私钥、信任模型等概念
- 元数据泄露:目录结构(有哪些账户)未加密,Git 仓库暴露会泄露这部分信息
- 无自动填充:需配合 Browserpass 等插件,不如商业密码管理器无缝
- 冲突解决:多人同时修改同一密码时,需要手动处理 Git 冲突
结语
pass 不是为所有人设计的密码管理器。如果你追求“开箱即用”和“全自动”,1Password 或 Bitwarden 可能更合适。但如果你信奉 Unix 哲学,希望完全掌控自己的数据,理解每一层加密原理,并且已经在日常使用 Git 和 GPG——那么 pass 就是那个最纯粹、最透明、最 Unix 的选择。
它用最简单的抽象解决了最复杂的问题:你的密码,用你自己的密钥,存在你自己的文件里,同步到你自己的 Git 仓库。没有黑盒,没有订阅费,没有厂商锁定。这就是 pass 的魅力所在。
参考资源
- 官方网站:https://www.passwordstore.org/
- Git 仓库:https://git.zx2c4.com/password-store/
- ArchWiki 文档:https://wiki.archlinux.org/title/Pass
- 社区扩展列表:https://www.passwordstore.org/#extensions
- 兼容客户端:https://www.passwordstore.org/#other
原文 https://blog.csdn.net/2301_79518550/article/details/162431630