Tools

給技術愛好者的密碼管理新選擇:用 pass 體會 Unix 哲學的密碼管理

還在使用瀏覽器紀錄密碼的你,是否曾擔心過安全性問題呢?想要找一個強大的密碼管理工具,卻又對於密碼交給中心化服務儲存有疑慮嗎?這篇文章將介紹一款開源且強大的密碼管理工具 pass,不僅能透過 Git 同步 GPG 加密過的密碼,除了指令能操作密碼外,還有許多衍伸的圖形化 app 或瀏覽器擴充功能,讓使用起來更加便利。

2025-10-18

pass 的運作原理與安全性

所謂的 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 mvpass cppass 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-native:

  • Linux

    1. 使用 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
      
    2. 安裝瀏覽器的 NativeMessagingHosts,可用的 browser 請參考 GitHub 上的列表

      cd /usr/lib/browserpass/
      export BROWSER="browser name"
      make "hosts-$BROWSER-user"
      
  • macOS

    1. 使用 homebrew 安裝 browserpass-native

      brew tap amar1729/formulae
      brew install browserpass
      
    2. 安裝瀏覽器的 NativeMessagingHosts,其中 browser 可選擇 chromiumfirefox。對於其分支像是 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,根據使用的瀏覽器至對應的擴充功能頁面下載安裝即可:

若是使用 macOS,GPG 的執行檔位置可能與預設的不同,需要另外在擴充功能設定頁面調整:

# 取得 gpg 的執行檔位置
which gpg

以上為 pass ——簡單但功能強大密碼管理工具——的介紹以及使用方式,提供給熱愛技術的你們。

Copyright © 2025 SquidSpirit