跳轉到

什麼是 age?

出門前要把備份加密後放上雲端,或者要把一份檔案交給另一個人,多數人第一個想到 PGP,然後在產生金鑰、匯入公鑰、決定信任等級那幾步放棄。age 是為「把一個檔案加密給某個人或某組密語」重新設計的工具:金鑰只有一行,沒有選項,一個檔案格式,規格只有一頁長。

站上的本機檔案加密輸出的就是 age 格式。這一頁先說明 age 是什麼、怎麼用、跟 PGP 差在哪,以及為什麼選它。

age 是什麼

age 由 Go 語言密碼學函式庫的維護者 Filippo Valsorda 設計,2019 年公開,格式規格由 C2SP 社群規格計畫維護,網址就是格式的第一行 age-encryption.org/v1。作者對它的描述是「簡單、現代、安全的檔案加密工具、格式與函式庫」,設計目標寫得很直白:小而明確的金鑰、沒有設定項、能跟 UNIX 管線組合。

三種實作可以互相解開彼此的檔案:

  • age:Go 寫的參考實作與命令列工具。
  • rage:Rust 實作,命令列介面相同。
  • typage:TypeScript 實作,在瀏覽器裡也能執行,站上的工具用的就是它。

外掛機制讓硬體金鑰(例如 YubiKey)也能當收件人,命令列工具另外支援直接用 SSH 公鑰加密。2025 年之後規格加入了後量子混合金鑰的收件人類型,命令列工具用 -pq 開啟。

怎麼用

安裝:macOS 與 Linux 用 brew install age,Debian 12 之後 apt install age,Windows 用 winget install --id FiloSottile.age。

密語模式,不需要任何金鑰:

age -p -o backup.tar.age backup.tar
age -d -o backup.tar backup.tar.age

第一行會問你密語兩次,第二行解密時問一次。密語的強度就是整份加密的強度,用密語產生器抽六個詞以上,理由見 Asian Diceware 密語字典。

公鑰模式,把檔案加密給某個人:

age-keygen -o key.txt
age -r age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p -o file.age file
age -d -i key.txt -o file file.age

age-keygen 產生的私鑰檔裡附著公鑰,那一行 age1 開頭的 62 個字元就是可以公開貼給別人的收件人。-r 可以重複給好幾個收件人,同一份密文任何一位都能解開。加上 -a 輸出會變成純文字,可以貼進郵件或聊天視窗。

格式長什麼樣

age 檔案的前面幾行是純文字,用文字編輯器打開就能看見:

age-encryption.org/v1
-> X25519 <一段 base64 的臨時公鑰>
<一段 base64>
--- <header 的驗證碼>

第一行是版本。中間每一段 -> 開頭的叫收件人段落,一位收件人一段,裡面是用該收件人的金鑰包起來的檔案金鑰。密語模式只有一段,型別是 scrypt,帶著 16 位元組的鹽與工作因數。--- 那一行是整個 header 的 HMAC-SHA-256,改動任何一段都會被發現。

header 之後是密文本體。內容用 ChaCha20-Poly1305 切成每 64 KiB 一段加密,每一段都有自己的驗證標籤,段落順序與最後一段都編進 nonce 裡。這代表三件事:任何一個位元組被改過都會在解密時被擋下,大檔案可以邊讀邊解,不必整份載入記憶體,以及密文比原檔大一點(每 64 KiB 多 16 位元組,加上 header)。

公鑰模式的收件人段落只含一個臨時公鑰,不含收件人自己的公鑰,所以從密文本身無法看出是加密給誰,只看得出有幾位收件人。這一點跟 PGP 預設把收件人的金鑰 ID 寫進密文不同。

跟 PGP 差在哪

PGP 是 1991 年的軟體,OpenPGP 是它的公開標準,RFC 9580(2024 年)是最新版,取代 2007 年的 RFC 4880。它做的事比 age 多得多:加密、簽章、身分、信任網、金鑰伺服器,一份金鑰上掛著名字、電子郵件、期限與好幾把子金鑰。

age OpenPGP
做的事 只加密檔案 加密、簽章、身分與信任網
演算法 固定一組:X25519、ChaCha20-Poly1305、scrypt、HMAC-SHA-256 多種可選,雙方協商
金鑰長什麼樣 一行 62 個字元 一個區塊,上千字元,含身分與期限
設定項 沒有 GnuPG 的設定檔有上百項
完整性 每 64 KiB 一段驗證,改一個位元組就解不開 舊格式的 MDC 只給警告,2024 年起才有 AEAD
簽章 沒有 有
密文透露收件人 不透露 預設寫進金鑰 ID,要另外開選項才藏
規格長度 一頁 上百頁
實作 Go、Rust、TypeScript 三份互通 GnuPG 為主,其餘實作各自覆蓋部分規格

兩件 PGP 的歷史值得知道。1999 年的可用性研究「Why Johnny Can't Encrypt」找了十二個人用 PGP 5.0 寄一封加密信,多數人在九十分鐘內無法完成,還有人把私鑰寄了出去。2018 年的 EFAIL 攻擊利用舊格式的密文可以被改動、郵件軟體對驗證失敗只給警告照樣顯示這兩件事,把加密郵件的內容從 HTML 外連裡偷出來。兩者的根源相同:選項太多、能設錯的地方太多、規格留給實作的自由度太大。age 的設計就是把那些地方全部拿掉。

age 也放棄了幾件事。它不簽章,能解開一個檔案不代表知道是誰加密的,來源要用別的方式確認。它沒有身分與信任模型,對方的公鑰要透過你信任的管道取得,通常是當面或既有的加密通訊。兩者都沒有前向保密:私鑰或密語一旦外洩,過去所有用它加密的檔案都能被解開。

為什麼站上的工具選 age

讀者三年後要解一份備份時,手上可能只剩一台裝了命令列工具的電腦,網站還在不在都不一定。age 是公開格式,三份獨立實作互通,任何一台電腦都能解開,這是選公開格式而非自訂格式的全部理由。

在公開格式裡選 age 而非 PGP,理由是上面那張表的每一列都指向同一件事:沒有選項就沒有設錯的機會,規格短就能在瀏覽器裡實作得小而能審,密語模式不需要任何金鑰管理。本機檔案加密有密語、passkey 與公鑰三種模式,最簡單的一條只要選檔案、輸入密語、下載。

PGP 留在它該在的地方。站上的敏感資料上傳流程用 PGP,因為那裡需要長期的身分、要跟郵件生態相容,而且對方是已經在用 PGP 的記者與組織。分工是:郵件與身分用 PGP,檔案與備份用 age。

注意

  • 密語模式的安全全在密語。scrypt 讓每次猜測變慢,但無法抵擋一個弱密語。
  • 檔名不在密文裡,你把加密檔存成什麼名字,別人就看到什麼名字。備份取一個不透露內容的檔名。
  • 密文大小約略反映原檔大小,藏不了檔案有多大。
  • 解密後的檔案落在磁碟上就是明文,用完要刪,磁碟本身沒有全碟加密的話刪了也可能被還原。

相關閱讀