Skip to content
Go back

使用 Pass 进行密码管理

| 14 min read
Edit page

在使用 Pass 之前,我主要依赖 Chrome 内置的密码管理器,而在 Chrome 无法覆盖的场景中,则通过一套自建的密码规则手动记忆密码。这种组合方式陪伴我使用了近九年电脑,虽然尚且安全,但始终让人心存隐忧——无论是手动记忆的可靠性,还是将密码托管给第三方服务都存在不确定性。虽然市面上有 1Password 等商业软件,以及支持自建或官方服务的 Bitwarden 可选,但只要是依赖第三方托管,就不可避免地面临数据泄露风险,各大厂商频发的数据拖库事件也印证了这一点。

经过分析,似乎只能选择自建 Bitwarden 服务端并配合客户端来实现密码管理。但最终我没有采用这个方案,而是发现了 password-store(以下简称 Pass)。这个工具完全满足了我的需求,使用九个月以来,我已将所有历史密码替换为随机密码,显著提升了安全性。

本文将介绍如何基于 Pass 及其生态实现常用密码管理器的核心功能,包括加密存储、随机密码生成、版本控制、多端同步、浏览器插件和桌面客户端等。

Pass 简介

让我们思考一下密码管理器的核心需求:首先需要能够存储密码,其次最好支持加密存储。在此基础之上,若能提供搜索、同步等高级功能就更完善了。Pass 正是这样一款遵循 Unix 哲学 的密码管理器,它坚持”一切皆文件”的设计理念。

简单来说,Pass 采用每个密码对应一个文件的方式,通过 GPG 加密存储密码,使用时再通过 GPG 解密查看。本质上,Pass 是对 GPG 工具的封装,使其具备了管理密码的能力。

关于密码管理器的需求拆解和 Pass 的详细介绍,推荐阅读这篇文章:pass : 密码管理本不复杂。如果链接无法访问,可以查看 Web Archive 的备份。

Pass 优缺点

基于我的使用体验,以下是 Pass 的主要优缺点。

优点

  1. 加密存储——这是密码管理器的基础能力,如果做不到加密,还不如直接使用 Excel。
  2. 纯文本存储——便于使用 Git 进行版本控制和多端同步。
  3. CLI 支持——可以与各种命令行工具无缝集成。当然,对于不熟悉命令行的用户来说,这也是一个门槛。

缺点

  1. 需要理解并使用 GPG
  2. 需要具备基础的加密知识
  3. 需要接受使用命令行的交互方式

如果不能接受这些缺点,自然也就无法享受 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
  1. 选择密钥种类:建议选择 (9) ECC (sign and encrypt)
  2. 选择主密钥曲线:建议选择 (1) Curve 25519
  3. 设置密钥有效期:这里的有效期仅作为提醒,实际不会限制使用。可以设置为 10 年,输入 10y
  4. 提供用户身份信息:邮箱地址将作为后续初始化 Pass 的 GPG ID,建议使用常用邮箱
    • 真实姓名:输入你的姓名
    • 电子邮件地址:输入关联的邮箱
    • 注释:(可选)可留空
  5. 设置强密码:这是密码本的”主密码”,一旦忘记,密码本中存储的所有密码将无法恢复,务必妥善记忆
  6. 生成密钥:移动鼠标、敲打键盘以帮助系统收集随机熵
  7. 完成:生成成功后会显示确认信息

完成后,可以通过以下命令查看生成的密钥对:

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 会自动解析密码文件的内容,支持以下格式:

示例格式:

your-password-here
username: your-username
email: [email protected]
url: https://example.com

使用方法

配置完成后,在浏览器中:

  1. 点击 Browserpass 图标打开密码列表
  2. 输入关键词搜索密码条目
  3. 选择密码条目后,会自动填充用户名和密码
  4. 如果密码条目包含 url 字段,插件会自动匹配当前网站

桌面程序

我的桌面端采用 pass + fzf 的组合方案,通过一个 自定义脚本 构建 TUI 界面。该脚本由 Claude Code 配合 GLM 辅助完成,我已将其命名为 pass_fzf,并高度依赖它来管理密码仓库。前文提到的密码生成功能,pass_fzf 同样提供了开箱即用的便捷配置,无需记忆复杂命令。

pass_fzf 的核心功能包括:

  1. 创建新的密码条目
  2. 复制指定条目的密码
  3. 使用默认编辑器修改指定密码
  4. 为指定密码条目重新生成密码
  5. 重命名指定密码条目
  6. 删除指定密码条目
  7. 查看指定密码条目
pass_fzf TUI 界面
pass_fzf TUI 界面

快捷键配置

Linux 系统

在 Omarchy(基于 Arch Linux)系统上,我使用 Hyprland 窗口管理器,通过以下配置即可轻松绑定全局快捷键:

bindd = SUPER SHIFT, SLASH, Passwords, exec, omarchy-launch-tui ~/.local/xbin/pass_fzf

macOS 系统

在 macOS 上,我依赖 skhd 绑定全局快捷键,配置可参考 我的配置文件。不过需要注意的是,macOS 对真正的全局快捷键支持仍然存在一定限制。

结语

经过三个月的实际使用,这套组合已经能够满足我的绝大部分需求:

这套方案在安全性、可控性和使用体验上取得了很好的平衡。


Edit page
Share this post on:
文章标题:使用 Pass 进行密码管理
文章链接: https://blog.guanglai.me/posts/use-password-store/

商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接。您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但分发衍生作品时必须采用相同的许可协议。

本文采用 CC BY-NC-SA 4.0 进行许可。


Next Post
2025 年底装机记录