給技術愛好者的密碼管理新選擇:用 pass 體會 Unix 哲學的密碼管理
還在使用瀏覽器紀錄密碼的你,是否曾擔心過安全性問題呢?想要找一個強大的密碼管理工具,卻又對於密碼交給中心化服務儲存有疑慮嗎?這篇文章將介紹一款開源且強大的密碼管理工具 pass,不僅能透過 Git 同步 GPG 加密過的密碼,除了指令能操作密碼外,還有許多衍伸的圖形化 app 或瀏覽器擴充功能,讓使用起來更加便利。
2025-10-18pass 的運作原理與安全性
所謂的 Unix 哲學崇尚簡潔、模組化,而 pass 就是一個把密碼管理做到極致簡單的工具,同時密碼管理該有的核心功能是分毫不差。它的簡單在於,一個密碼就是一個檔案,並且用 GPG 進行加密,檔名可以是服務或是網站的名稱,再透過資料夾將這些密碼進行分類管理。而 pass 則是提供了一個指令介面,讓使用者能夠方便的操作這些密碼。
除了 pass 本身的功能外,因為它的簡單,並使用其他知名的 library,也帶來了額外很多好處:
- 使用 GPG 加密,儘管加密密碼檔案不幸流出,其內容仍無法被存取,安全性高。
- 可選擇自動生成的密碼長度,以及是否包含特殊符號;抑或是使用自定義密碼。
- 密碼都存在本地(預設為
~/.password-store),除了自己本人以外,不會有第二人擁有。 - 想要備份或轉移密碼,只需要複製這些密碼檔案即可。
- 以 Git 追蹤密碼變更記錄,在不同裝置間發生沖突的話容易解決。
- 使用指令介面操作時,能透過自動補全找到密碼。
- 不論 Chromium based、 Firefox 瀏覽器或 Android、iOS 上,都有對應的圖形化擴充功能和 app 能使用。
安裝與基本使用方式
設置 GPG secret key
前面有提到,pass 是使用 GPG 進行加密,因此我們要先安裝 GPG 並建立一個屬於自己的 secret key。如果已經擁有的話,可以跳過這一步。
GPG 只需要透過系統的套件管理管理工具安裝即可:
-
Linux
# Arch Linux based sudo pacman -Sy gnupg # Debian based sudo apt update && sudo apt install gnupg # Red Hat based sudo dnf install gnupg2 -
macOS
brew update && brew install gnupg
接著透過以下指令建立 secret key:
建立 GPG key 時,會被要求輸入使用此密鑰的密碼,請記得使用獨一無二的強密碼!
# 透過引導問題建立
gpg --full-gen-key
# 透過單行指令快速建立
gpg --quick-gen-key "名字 <信箱>" 加密算法 sign,encr 過期時間
# e.g. gpg --quick-gen-key "John Doe <john.doe@example.com>" rsa4096 sign,encr 0
最後確認 secret key 是否有成功建立:
gpg --list-secret-keys
安裝 pass 並初始化
透過系統的套件管理管理工具安裝:
-
Linux
# Arch Linux based sudo pacman -Sy pass # Debian based sudo apt update && sudo apt install pass # Red Hat based sudo dnf install pass -
macOS
brew update && brew install pass
再來我們需要初始化 pass 儲存密碼的空間,其中的字串請替換為自己的 GPG secret key ID:
# 列出所有 secret key
gpg --list-secret-keys
# 以指定的 key ID 初始化 pass 目錄
pass init "GPG secret key ID"
之後 pass 便會使用指定的 GPG key 加密密碼字串,並存放在 ~/.password-store 中。
常用的 pass 指令
新增密碼
pass generate 會以 /dev/urandom 生成預設長度為 25,且包含英文大小寫、數字、特殊符號的密碼:
- 密碼名稱可以包含
/表示目錄路徑,用以分類 - 名稱後方可接整數,指定密碼長度
- 加上
--no-symbol或-n使密碼不包含特殊符號
# 生成一個名為 google.com 的密碼
pass generate google.com
# 生成一個名為 squidspirit.com 的密碼,並放置在 geranal/mail 的目錄之下
pass generate general/mail/squid@squidspirit.com
# 生成一個名為 bank 的密碼,長度為 12,且不含特殊符號
pass generate bank 12 -n
pass insert 則會以引導式對話的方式,輸入指定的密碼:
# 建立一個名為 openai-api-key 的密碼,但密碼內容可自行決定並輸入
pass insert openai-api-key
取得密碼或列出目錄下的密碼
直接輸入 pass 指令可以列出所有的密碼,在後面接上目錄名稱可列出目錄下的密碼,接上密碼名稱則可將密碼內容輸出在終端機上(gpg-agent 會要求使用者輸入 GPG secret key 的密碼):
# 列出所有密碼
pass
# 列出 general 下的所有密碼(若 general 是目錄名稱)
pass general
# 輸出 google.com 的密碼內容
pass google.com
將密碼複製到剪貼簿
如果不希望將密碼輸出至終端機,可以使用 --clip 或 -c 直接將密碼複製進剪貼簿:
# 將 google.com 的密碼內容複製進剪貼簿
pass -c google.com
如果使用 Linux,會需要根據桌面環境安裝剪貼簿複製的工具。Wayland 為
wl-clipboard,Xorg 為xclip。
移動、複製或刪除密碼
移動、複製與刪除密碼的的指令與終端機指令相同,為 pass mv、pass cp 與 pass rm,此處便不加以舉例。
透過 Git 追蹤變更記錄
前面有提到,每個密碼都是獨立的、一個加密過的檔案,因此我們也當然可以用 Git 做版本控制。而 pass 這套工具也整合了常用的 Git 的操作。若想要在操作密碼時,自動提交變更的 commit 記錄,只需要讓 .password-store 成為 Git repository 即可。
cd ~/.password-store && git init
# 或使用 pass 的方法
pass git init
跨裝置同步密碼
既然有 Git 可以追蹤變更記錄,那當然也可以上傳到遠端的 repository 像是 GitHub 進行同步。但是這樣安全嗎?確實將這些密碼上雲,雖然已經加密過了,但仍然有一定的風險,只是這個風險其實相當低。因為加密密碼是只能用 GPG 私鑰解開的(以當今的電腦硬體,暴力破解 RSA 409 是不可能的),也就是説攻擊者只取得加密密碼是沒有用的。
而 GPG 還有第二道防線,如果存在本地的 GPG 私鑰不幸外洩,攻擊者還需要有私鑰的密碼才能解開。不過這個風險相對高很多,若私鑰密碼強度不足,暴力破解就有機會解開了。因此極度不建議將 GPG 的私鑰存放在本地以外的地方。
了解風險之後,若認為為了便利性,犧牲這樣的風險是可以接受的,那就輸入以下指令將 pass 與遠端 Git repository 綁定吧:
記得要將 repository 的權限設為 private 的!
pass git remote add origin "repository url"
# e.g. pass git remote add origin git@git.squidspirit.com/squid/password-store.git
之後若想要將密碼變更推送到遠端,或是從遠端拉取下來,只需要以下指令,用法與 Git 原本的用法相同:
# 將變更推送到遠端
pass git push
# 將變更從遠端拉取
pass git pull
若發生衝突,因為是基於 Git 的,因此去查找解決 Git 衝突的方式就可以了。
匯出與匯入 GPG secret key
同步密碼之外,也需要將 GPG key 複製到另一台設備上。我們需要先在原本的設備將 secret key 匯出,用 USB 或其他安全的傳輸方式移動到另一台設備上,再匯入到 GPG 資料庫中。
# 列出所有 secret key
gpg --list-secret-keys
# 將指定的 key 匯出到文字檔
gpg --export-secret-keys --armor "secret key ID" > key.asc
# e.g. gpg --export-secret-keys --armor "3348882F6AC6A4C2835844EA7F2D448A44A4DC30" > key.asc
# 將 secret key 匯入,並信任該 secret key
gpg --import key.asc
gpg --edit-key "secret key ID" trust quit
# e.g. gpg --edit-key "3348882F6AC6A4C2835844EA7F2D448A44A4DC30" trust key
在完成匯入後,記得完全刪除密鑰檔案。
在不同裝置的圖形化介面
透過指令存取密碼當然很美好,但若需要在網站上登入,有瀏覽器的擴充功能一定還是比較方便;若是想要在手機使用,用指令存取則顯得不切實際。在 pass 的官方網站上有列出一些衍伸工具可以使用,其中瀏覽器擴充功能的使用方式比較繁瑣,這邊會說明怎麼操作,至於其他的就交給各位自行研究啦。
使用瀏覽器擴充功能存取 pass 密碼
與 pass 瀏覽器擴充功能相關的 GitHub repository 有兩個:
- browserpass/browserpass-native: 使用 messaging API 在瀏覽器與本地程序通訊。
- browserpass/browserpass-extension: 擴充功能的前端,安裝在瀏覽器上。
首先要先安裝 browserpass-native:
-
Linux
-
使用 package manager 安裝 browserpass-native
# Arch Linux based sudo pacman -Sy browserpass # Debian based sudo apt update && sudo apt install webext-browserpass # Ret Hat based sudo dnf install browserpass -
安裝瀏覽器的 NativeMessagingHosts,可用的 browser 請參考 GitHub 上的列表
cd /usr/lib/browserpass/ export BROWSER="browser name" make "hosts-$BROWSER-user"
-
-
macOS
-
使用 homebrew 安裝 browserpass-native
brew tap amar1729/formulae brew install browserpass -
安裝瀏覽器的 NativeMessagingHosts,其中 browser 可選擇
chromium或firefox。對於其分支像是 Chrome、Arc、Edge 需要再另外將 native messaging 的設定檔,連結到對應的位置。export BROWSER="chromium or firefox" PREFIX='/opt/homebrew/opt/browserpass' make hosts-firefox-user -f '/opt/homebrew/opt/browserpass/lib/browserpass/Makefile' # 連結 chromium 設定檔到對應的位置,以下以 Edge 為例 ln -s /opt/homebrew/opt/browserpass/lib/browserpass/hosts/chromium/com.github.browserpass.native.json /Users/an920107/Library/Application\ Support/Microsoft\ Edge/NativeMessagingHosts/
-
接著要安裝 browserpass-extension,根據使用的瀏覽器至對應的擴充功能頁面下載安裝即可:
- Chromium based: Chrome Web Store
- Firefox based: Firefox Add-ons
若是使用 macOS,GPG 的執行檔位置可能與預設的不同,需要另外在擴充功能設定頁面調整:
# 取得 gpg 的執行檔位置
which gpg
以上為 pass ——簡單但功能強大密碼管理工具——的介紹以及使用方式,提供給熱愛技術的你們。