介紹如何使用 age 加密工具,對檔案進行加密與解密。
age 是一個開放原始碼的檔案加密工具,同時也是一種檔案加密格式,它的特點是金鑰格式簡潔,沒有複雜的設定檔,同時也遵循傳統 UNIX 工具的設計風格,可以非常快速且方便地與各種 UNIX 指令工具結合使用。
若在 Ubuntu Linux 22.04 以後的系統中,可以使用 apt
安裝 age 加密工具:
# 安裝 age 加密工具
sudo apt install age
各種作業系統中大部分常見的套件管理系統都已經收錄了 age,關於其他作業系統的安裝方式,可以參考 age 官方網站上面的說明。
原生的 age 金鑰可以使用 age-keygen
這個工具產生,採用的協議是 X25519,金鑰格式精簡、安全性也很高:
# 產生 X25519 金鑰儲存至 key.txt age-keygen -o key.txt
Public key: age1ega7s73mj75afdjqt8l9rwulv4rlc35deys8fs83k6lu4zn9mgzsd5gvqx
而產生的私鑰檔案 key.txt
內容則為:
# created: 2023-05-31T19:56:38+08:00 # public key: age1ega7s73mj75afdjqt8l9rwulv4rlc35deys8fs83k6lu4zn9mgzsd5gvqx AGE-SECRET-KEY-1SEMXS5JAR97MADJVX52W25N7ZXAM47RFT2GMURH5R2XDMHAZAZAQYW2RWD
age-keygen
指令加上 -y
參數可以從檔案或標準輸入讀入私鑰,然後輸出接受者(recipient)清單:
# 產生接受者清單 age-keygen -y key.txt
age1ega7s73mj75afdjqt8l9rwulv4rlc35deys8fs83k6lu4zn9mgzsd5gvqx
這個動作實際就輸出對應的公鑰。若輸入的資料中包含多筆私鑰,就會以一行一筆的方式對應輸出多筆公鑰。
在以 age-keygen
產生了 X25519 的公鑰與私鑰之後,就可以使用公鑰進行加密:
# 使用公鑰加密 secret.txt 檔案 age -o secret.txt.age \ -r age1ega7s73mj75afdjqt8l9rwulv4rlc35deys8fs83k6lu4zn9mgzsd5gvqx \ secret.txt
這裡的 secret.txt
就是要進行加密的檔案,-o
參數用於指定加密後的輸出檔案為 secret.txt.age
,而 -r
參數則是以公鑰指定接收者,加密之後只能使用對應的私鑰進行解密,若要同時發送給多位接收者,可以使用多個 -r
參數指定多組公鑰。
# 同時指定兩位接收者(公鑰) age -o secret.txt.age \ -r age1ega7s73mj75afdjqt8l9rwulv4rlc35deys8fs83k6lu4zn9mgzsd5gvqx \ -r age18u75pyg9mq6hc95h3s2n4wl5g5aj67905ws0yrtcz2gflz97qfqsunhn9m \ secret.txt
如果要指定的接收者數量很多,可以將所有接收者的公鑰以一行一筆公鑰的格式寫在檔案中,再以 -R
參數指定公鑰的清單檔案,例如:
# 使用清單檔案指定大量接收者公鑰 age -o secret.txt.age -R recipients.txt secret.txt
經過 age
加密之後的檔案,可以使用對應的私鑰進行解密:
# 使用私鑰解密 secret.txt.age 檔案 age -d -o output.txt -i key.txt secret.txt.age
這裡的 -d
參數代表解密動作,-i
參數是用來指定解密用的私鑰,而 -o
參數則是指定輸出的檔案。
如果在以 age
加密時指定多筆接收者公鑰,則加密之後的檔案就可以使用任何一位接收者的私鑰進行解密。
age
也可以使用普通的密碼進行檔案的加密與解密:
# 使用密碼加密 secret.txt 檔案 age -o secret.txt.age -p secret.txt
這裡的 -p
參數代表以密碼進行加密,執行後 age
會從終端機上要求使用者輸入要用來加密的密碼,而 -o
參數則是指定加密後的輸出的檔案。
若要解密以密碼加密之後的檔案,也同樣是使用 -d
參數,執行時 age
同樣會從終端機上要求使用者輸入密碼以進行解密:
# 使用密碼解密 secret.txt.age 檔案 age -o output.txt -d secret.txt.age
如果希望 age-keygen
所產生的 X25519 金鑰可以加上密碼保護,可以將產生的 X25519 金鑰交給 age
以密碼加密:
# 以密碼保護 X25519 金鑰 age-keygen | age -p > key.age
Public key: age142m44qyhl3fqq5um6x6822mj36k39uzq0cdm9kurmclv76me4emqjtrzcv
使用公鑰加密的步驟不便:
# 使用公鑰加密 secret.txt 檔案 age -o secret.txt.age \ -r age142m44qyhl3fqq5um6x6822mj36k39uzq0cdm9kurmclv76me4emqjtrzcv\ secret.txt
以密碼保護的 X25519 金鑰檔案的使用方式都跟普通的金鑰檔案相同,差異只在於使用私鑰解密時,鑰從終端機輸入密碼:
# 使用有密碼保護的私鑰解密 secret.txt.age 檔案 age -d -o output.txt -i key.txt secret.txt.age
age 的工具都遵循傳統 UNIX 工具的設計風格,可以非常方便地與各種標準 UNIX 工具結合使用,最常見的用法是搭配壓縮指令,將資料壓縮之後再加密:
# 以 tar.bz2 壓縮後再加密 tar jc data | age \ -r age1ega7s73mj75afdjqt8l9rwulv4rlc35deys8fs83k6lu4zn9mgzsd5gvqx \ > data.tar.bz2.age
在解密時也可以搭配解壓縮指令一起處理:
# 解密後再解壓縮 age -d -i key.txt data.tar.bz2.age | tar jx
age
除了使用 age-keygen
所產生的 X25519 金鑰之外,也可以使用普通 SSH 常用的 RSA 或 Ed25519 金鑰進行加解密。
# 產生 SSH 的 Ed25519 金鑰 ssh-keygen -t ed25519 # 使用 SSH 的 Ed25519 公鑰加密 age -R ~/.ssh/id_ed25519.pub secret.txt > secret.txt.age # 使用 SSH 的 Ed25519 私鑰加密 age -d -i ~/.ssh/id_ed25519 secret.txt.age > output.txt