在使用 Pass 之前,我主要依赖 Chrome 内置的密码管理器,而在 Chrome 无法覆盖的场景中,则通过一套自建的密码规则手动记忆密码。这种组合方式陪伴我使用了近九年电脑,虽然尚且安全,但始终让人心存隐忧——无论是手动记忆的可靠性,还是将密码托管给第三方服务都存在不确定性。虽然市面上有 1Password 等商业软件,以及支持自建或官方服务的 Bitwarden 可选,但只要是依赖第三方托管,就不可避免地面临数据泄露风险,各大厂商频发的数据拖库事件也印证了这一点。
经过分析,似乎只能选择自建 Bitwarden 服务端并配合客户端来实现密码管理。但最终我没有采用这个方案,而是发现了 password-store(以下简称 Pass)。这个工具完全满足了我的需求,使用九个月以来,我已将所有历史密码替换为随机密码,显著提升了安全性。
本文将介绍如何基于 Pass 及其生态实现常用密码管理器的核心功能,包括加密存储、随机密码生成、版本控制、多端同步、浏览器插件和桌面客户端等。
Pass 简介
让我们思考一下密码管理器的核心需求:首先需要能够存储密码,其次最好支持加密存储。在此基础之上,若能提供搜索、同步等高级功能就更完善了。Pass 正是这样一款遵循 Unix 哲学 的密码管理器,它坚持”一切皆文件”的设计理念。
简单来说,Pass 采用每个密码对应一个文件的方式,通过 GPG 加密存储密码,使用时再通过 GPG 解密查看。本质上,Pass 是对 GPG 工具的封装,使其具备了管理密码的能力。
关于密码管理器的需求拆解和 Pass 的详细介绍,推荐阅读这篇文章:pass : 密码管理本不复杂。如果链接无法访问,可以查看 Web Archive 的备份。
Pass 优缺点
基于我的使用体验,以下是 Pass 的主要优缺点。
优点
- 加密存储——这是密码管理器的基础能力,如果做不到加密,还不如直接使用 Excel。
- 纯文本存储——便于使用 Git 进行版本控制和多端同步。
- CLI 支持——可以与各种命令行工具无缝集成。当然,对于不熟悉命令行的用户来说,这也是一个门槛。
缺点
- 需要理解并使用 GPG
- 需要具备基础的加密知识
- 需要接受使用命令行的交互方式
如果不能接受这些缺点,自然也就无法享受 Pass 的优点——鱼和熊掌不可兼得。
安装
我日常使用的主力操作系统是 macOS 和基于 Arch Linux 的 Omarchy,因此这里仅列出这两个系统的安装方式。
macOS
brew install pass
Arch Linux
sudo pacman -S pass
初始化设置
安装完成 Pass 后,第一步是配置 GPG。
GPG 配置
执行以下命令生成 GPG 密钥对(包含主密钥和加密子密钥),按回车后将启动向导。如果对相关概念不够了解,建议先查阅资料或向 AI 寻求帮助,以充分理解 GPG 的核心概念。
也可以直接按照下方的参考选项配置,这对使用 Pass 已经足够了。
gpg --full-generate-key
- 选择密钥种类:建议选择
(9) ECC (sign and encrypt) - 选择主密钥曲线:建议选择
(1) Curve 25519 - 设置密钥有效期:这里的有效期仅作为提醒,实际不会限制使用。可以设置为 10 年,输入
10y - 提供用户身份信息:邮箱地址将作为后续初始化 Pass 的 GPG ID,建议使用常用邮箱
- 真实姓名:输入你的姓名
- 电子邮件地址:输入关联的邮箱
- 注释:(可选)可留空
- 设置强密码:这是密码本的”主密码”,一旦忘记,密码本中存储的所有密码将无法恢复,务必妥善记忆
- 生成密钥:移动鼠标、敲打键盘以帮助系统收集随机熵
- 完成:生成成功后会显示确认信息
完成后,可以通过以下命令查看生成的密钥对:
gpg --list-secret-keys
需要注意的是,GPG 密钥对存在单点故障风险。一旦密钥丢失,所有加解密操作都将无法进行,因此强烈建议通过 U 盘等离线介质备份 GPG 的公私钥。
Pass 初始化
配置完成 GPG 后,即可初始化 Pass,过程非常简单。
命令中的 [email protected] 替换为之前生成 GPG 密钥对时使用的邮箱地址,我们以此作为 GPG ID。
pass init [email protected]
执行完成后,Pass 会在 $HOME/.password-store 创建默认的工作目录,这也是未来存储所有密码的目录。虽然可以修改路径,但通常没有必要,直接使用默认目录即可。
至此,Pass 的初始化就完成了,过程本身并不复杂,主要难点在于对 GPG 的理解和使用。
Git 初始化
建议使用以下命令初始化 Git,相比直接使用 git init,这条命令会额外创建 .gitattributes 文件,用于配置所有 .gpg 后缀文件在 diff 时自动解密后再进行对比。
pass git init
Pass 封装了 git 子命令,允许在不进入工作目录的情况下执行 git 操作。不过在实际使用中,我更习惯直接 cd ~/.password-store 后使用常规 git 命令进行版本控制。
历史密码导入
pass 的密码导入工具还是很多的,这里可以参考官网的 Migrating to pass 章节,这里我就不赘诉了。
基本使用
实际上,你只需要记住 pass edit 这一个命令即可。
举个简单的例子:假设要存储 GitHub 的密码,网址为 github.com,可以通过以下命令创建条目:
pass edit github.com
按回车后,Pass 会调用系统的 $EDITOR 编辑器让你输入内容(密码),退出编辑后,会在 $HOME/.password-store 目录下创建一个名为 github.com.gpg 的加密文件。
如果要创建多层级条目呢?同样很简单:
pass edit guanglai/github.com
这条命令会在 $HOME/.password-store 下先创建 guanglai 目录(如果不存在),然后创建 github.com 条目。
总而言之,使用 Pass 时,我们本质上是在编辑文本文件,只是 Pass 通过封装的 GPG 命令在后台自动处理加密和解密。实际存储的是加密后的二进制或文本文件(如果 GPG 设置为 ASCII Armor 模式,则是一串加密后的文本)。这一切并没有想象中那么复杂。
若要更新密码,使用相同的命令即可。
随机密码生成
可以使用 Pass 自带的 pass generate 命令生成密码,以 github.com 条目为例:
# 生成长度为 16 的随机密码
pass generate github.com 16
# 生成长度为 16 的随机密码,不包含特殊符号
pass generate -n github.com 16
# 生成长度为 16 的随机密码(不含特殊符号),并复制到剪贴板
pass generate -nc github.com 16
# 生成长度为 16 的随机密码,并替换现有条目
pass generate -i github.com 16
如果 Pass 的密码生成功能无法满足需求,可以使用 pwgen 工具:
# 生成长度为 16 的 1 个完全随机的密码
pwgen -ncys 16 1
# 生成长度为 16 的 1 个相对简单的密码
# 包含至少一个数字、小写字母、大写字母
pwgen -ncy 16 1
在 macOS 上,可以结合 pbcopy 命令,生成密码后自动复制到剪贴板,然后使用 pass edit 粘贴保存:
pwgen -ncys 16 1 | pbcopy
浏览器插件
浏览器插件本质上是 Pass 的前端程序,提供了关联网站的自动填充用户名和密码功能。
我日常使用的是 Chrome 系浏览器,配合 Browserpass 插件来实现密码的自动填充。
安装浏览器插件
首先从 Chrome Web Store 安装 Browserpass 扩展:
安装宿主程序
Browserpass 需要一个本地宿主程序才能与 Pass 通信,不同系统的安装方式如下:
macOS
brew tap amar1729/formulae
brew install browserpass # this will print further installation instructions, e.g. for Firefox:
PREFIX='/opt/homebrew/opt/browserpass' make hosts-firefox-user -f '/opt/homebrew/opt/browserpass/lib/browserpass/Makefile'
Arch Linux
sudo pacman -S browserpass
macOS 配置
macOS 下,一般还需要配置 ~/.gnupg/gpg-agent.conf 配置,文件内容为:
pinentry-program /opt/homebrew/bin/pinentry-mac
同时,安装 pinentry-mac:
brew install pinentry-mac
配置密码条目格式
Browserpass 会自动解析密码文件的内容,支持以下格式:
- 第一行:密码
- 后续行:元数据(Key: Value 格式)
示例格式:
your-password-here
username: your-username
email: [email protected]
url: https://example.com
使用方法
配置完成后,在浏览器中:
- 点击 Browserpass 图标打开密码列表
- 输入关键词搜索密码条目
- 选择密码条目后,会自动填充用户名和密码
- 如果密码条目包含
url字段,插件会自动匹配当前网站
桌面程序
我的桌面端采用 pass + fzf 的组合方案,通过一个 自定义脚本 构建 TUI 界面。该脚本由 Claude Code 配合 GLM 辅助完成,我已将其命名为 pass_fzf,并高度依赖它来管理密码仓库。前文提到的密码生成功能,pass_fzf 同样提供了开箱即用的便捷配置,无需记忆复杂命令。
pass_fzf 的核心功能包括:
- 创建新的密码条目
- 复制指定条目的密码
- 使用默认编辑器修改指定密码
- 为指定密码条目重新生成密码
- 重命名指定密码条目
- 删除指定密码条目
- 查看指定密码条目

快捷键配置
Linux 系统
在 Omarchy(基于 Arch Linux)系统上,我使用 Hyprland 窗口管理器,通过以下配置即可轻松绑定全局快捷键:
bindd = SUPER SHIFT, SLASH, Passwords, exec, omarchy-launch-tui ~/.local/xbin/pass_fzf
macOS 系统
在 macOS 上,我依赖 skhd 绑定全局快捷键,配置可参考 我的配置文件。不过需要注意的是,macOS 对真正的全局快捷键支持仍然存在一定限制。
结语
经过三个月的实际使用,这套组合已经能够满足我的绝大部分需求:
- 桌面端:pass_fzf
- iOS:passforios
- 浏览器插件:Browserpass
这套方案在安全性、可控性和使用体验上取得了很好的平衡。