使用 pass 管理密码

4 minute read

Pass 是一个使用 GPG 管理密码的工具。它的 网站 介绍说:

Pass: the standard unix password manager

有 ed 编辑器内味了1

Pass 保存的密码被存放在目录 ${PASSWORD_STORE_DIR:-$HOME/.password-store} 下,每个密码都是一个 GPG 加密的文件。除了密码还可以在此文件中存放用户名,OTP URI 等其它信息。同时还可以把该目录作为一个 Git 仓库用于同步密码。

生成 GPG 密钥

如果没有 GPG 密钥对则需要先生成。使用命令

gpg --full-gen-key

输入对应的信息即可,一般都可以用默认值。关于生成 GPG 密钥还可以看看 ArchWiki。为了避免每次需要密码的时候都得输入 GPG 密钥的密码,可以配置 GNOME Keyring 或者 pam-gnupg 来在登录后记住密码。

pass 命令

首先用生成 GPG 密钥的 email 初始化 pass:

pass init ${GPGEMAIL?}

添加密码

使用命令 pass insert email/fastmail,输入两遍密码即可添加 email/fastmail 的密码。当密码的名字带有 / 时会将密码文件存放在对应的子目录下。运行 pass 或者 pass ls 可以看到目前存储了哪些密码:

$ pass ls
Password Store
└── email
    └── fastmail

生成密码

使用 pass generate website 16 来生成一个长度为 16 的密码并保存为 website。可以加上 -n 选项生成不带特殊符号的密码。

$ pass generate website 16 -n
The generated password for website is:
yKGhEkei98fGRKY6

获取密码

获取 email/fastmail 的密码的方法是运行 pass email/fastmail,或者加上 -c 选项将密码复制到剪贴板,此密码会在 45 秒后从剪贴板消失。注意如果密码文件有多行(如还存放了用户名等其它信息时),此命令只复制第一行。

操作密码文件

pass mvpass cppass rmpass edit 对密码文件进行相应的操作。

使用 Git

可以使用 git 来同步密码。在对应的 git 命令前添加 pass 即可直接操作 pass 的 git 仓库。如

pass git init
pass git remote add origin git@git.example.com:password-store.git
pass git push -u origin master

为了安全还可以配置一个自己的 Git 服务器,见 搭建一个 Git 服务器

清除 dangling commits

有时想要重写 commit 历史,但是旧 commit 并不会被清除:

$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (26/26), done.
dangling commit b876e31a2740da9198c851532ce9a83ccaa71d21
dangling commit 74e9cfda669d39ef8154270fcc8e14e8247b7c05

此时可以使用如下命令来清除这些 commit。

git reflog expire --expire=now --all
git gc --prune=now

使用场景

我使用 pass 的主要场景是在脚本中获取密码,或者用于在配置文件中使用 pass 命令获取密码。这样做可以防止直接在配置中明文填写密码。如在 neomutt 中配置帐号时:

set my_pass = "`pass show email/foo | head -1`"
set smtp_pass = $my_pass

Pass 还可在浏览器中使用(Firefox 扩展 passff,Chrome 扩展 browserpass

Pass 的扩展

Pass 有许多扩展以增强其功能。例如可以通过 pass-otp 来使用 OTP:

  • 添加 OTP URI: pass otp add email/fastmail
  • 获取 OTP code: pass otp email/fastmail

虽然密码文件会被 GPG 加密,但是密码库的目录结构和文件名都是不加密的,任何人都可以查看。可以使用 pass-tomb 解决这个问题。它将密码存放在一个 tomb 中,查看密码前需要使用 pass open 将 tomb 打开,查看完毕后再使用 pass close 关闭 tomb。

其它的扩展见官网的 列表

iOS

Pass 在其它平台上都有客户端,在 iOS 中有 passforios。它有一些扩展功能,比如可在密码文件的第一行之后使用 key: value 的形式存放其他信息,如用户名等,可以方便地查看和复制这些额外信息。它也可以添加 OTP URI 以获取 OTP code。