// 安全研究 · 2026-06-29

pass 命令:标准 Unix 密码管理器

一、什么是 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://blog.csdn.net/2301_79518550/article/details/162431630