什么是 age?
age (Actually Good Encryption) 是一个由 Filippo Valsorda(Go 语言安全领域的知名专家)开发的现代文件加密工具。它的核心目标是提供一种简单、安全且易于使用的替代方案,用来取代陈旧且极其复杂的 PGP (Pretty Good Privacy) 或 GPG。
在传统的 PGP 体系中,用户经常被复杂的密钥环管理、过时的算法选项和难以理解的配置所困扰。age 抛弃了这些历史包袱,采用了现代密码学标准(如 X25519, ChaCha20-Poly1305),旨在让“加密一个文件并发送给某人”这件事变得像复制粘贴一样简单。
为什么选择 age 而不是 GPG?
| 特性 | PGP / GPG | age |
|---|---|---|
| 复杂度 | 极高,学习曲线陡峭 | 极低,几分钟即可上手 |
| 算法 | 混合了多种新旧算法,配置复杂 | 仅使用经过验证的现代算法 |
| 密钥管理 | 复杂的密钥环 (Keyrings) | 简单的文本文件 (SSH keys) |
| 依赖 | 庞大的软件安装包 | 单一二进制文件,无依赖 |
| 安全性 | 容易因错误配置导致漏洞 | 默认即安全 (Secure by Default) |
核心设计哲学
- 小而美:
age不尝试构建一个完整的信任网络(Web of Trust),它只专注于“加密”和“解密”这两个核心动作。 - 兼容 SSH 密钥:这是
age最天才的设计之一。如果你已经拥有 SSH 密钥(id_rsa或id_ed25519),你可以直接用它来加密文件,无需生成额外的age密钥。 - 不可篡改性:所有加密文件都带有身份验证标签,确保文件在解密前没有被篡改。
快速上手实例
1. 安装
由于 age 是用 Go 编写的,你可以通过多种方式安装:
# 使用 Go 安装 go install filippo.io/age@latest # macOS 使用 Homebrew brew install age
2. 生成密钥对
如果你没有 SSH 密钥,可以快速生成一对 age 密钥:
age-keygen -o key.txt
key.txt包含你的私钥(绝对不能泄露!)。- 运行
age-keygen -o key.txt后,终端会打印出你的公钥(可以发给任何人)。
3. 加密文件 (公钥加密)
假设你想给朋友发送一个名为 secret.txt 的文件,而你拥有对方的公钥 recipient_pub.txt:
age -r age1q... (对方的公钥) -o secret.txt.age secret.txt
-r: 指定接收者的公钥。-o: 指定输出的加密文件名。
4. 解密文件 (私钥解密)
当你收到一个 .age 加密文件时,使用自己的私钥进行解密:
age -d -i key.txt -o secret.txt secret.txt.age
-d: 执行解密操作。-i: 指定你的私钥文件。
5. 使用密码加密 (对称加密)
如果你不需要公钥体系,只想给文件设个密码(类似 zip 加密),可以使用 -p 参数:
# 加密:会提示你输入密码 age -p -o secret.txt.age secret.txt # 解密:会提示你输入密码 age -d -p -o secret.txt secret.txt.age
6. 进阶:使用 SSH 密钥加密
如果你已经有 ~/.ssh/id_ed25519.pub,你可以直接用它:
# 使用 SSH 公钥加密 age -r age-ssh-ed25519-xxxx... -o secret.txt.age secret.txt # 使用 SSH 私钥解密 age -d -i ~/.ssh/id_ed25519 -o secret.txt secret.txt.age
(注:你可以通过 age-keygen -y ~/.ssh/id_ed25519.pub 将 SSH 公钥转换为 age 格式的公钥)
开发者指南:在 Go 项目中集成 age
如果你是在开发一个 Go 程序,并希望在代码中实现文件加密,age 提供了极其简洁的 API。
依赖引入:
go get filippo.io/age
代码示例:加密流
package main
import (
"filippo.io/age"
"io"
"os"
)
func main() {
// 1. 加载接收者的公钥
recipient, err := age.ParseX25519PublicKey([]byte("你的公钥内容"))
if err != nil {
panic(err)
}
// 2. 创建加密写入器
outFile, _ := os.Create("secret.txt.age")
defer outFile.Close()
encryptor, err := age.Encrypt(outFile, recipient)
if err != nil {
panic(err)
}
// 3. 写入数据
io.WriteString(encryptor, "这是一段需要加密的机密信息")
encryptor.Close() // 必须关闭以写入验证标签
}
总结与建议
age 并不是要取代所有加密场景,但它在以下场景中具有绝对优势:
* 备份敏感配置文件(如 .env 文件、Kubeconfig)。
* 在不安全通道传输小文件(如通过邮件发送密码)。
* 替代复杂的 GPG 流程,为团队提供轻量级的加密方案。
如果你厌倦了 GPG 繁琐的 gpg --encrypt --recipient ... 命令,或者在为团队寻找一个现代化的文件加密标准,age 是目前最优雅的选择。



还没有评论,来说两句吧...