GPG(GNU Privacy Guard,也称 GnuPG)是 OpenPGP 标准的开源实现,主要用于数据加密、解密以及数字签名。无论保护敏感文件、加密邮件,还是为 Git Commit 签名,它都是最经典的工具。
1. 核心概念速览
- 公钥(Public Key): 相当于你的“收件箱地址”或“锁”。公开给所有人,别人用它给你加密文件,或用它验证你的签名。
- 私钥(Private Key): 相当于你的“钥匙”。绝对不能泄漏,用来解密别人发给你的加密文件,或对文件/代码进行签名。
- 主密钥与副密钥(Master Key & Subkey): 默认情况下,GPG 会生成一个主密钥(用于签名和管理其他密钥)和一个副密钥(用于加密)。
2. 密钥管理
2.1 生成密钥对
打开终端,运行以下命令启动交互式生成向导:
gpg --full-generate-key
推荐选择:
- 密钥类型: 选择
(1) RSA and RSA (default)或(9) ECC and ECC(推荐 ECC/Ed25519,更小更安全)。 - 密钥长度: 若选择 RSA,建议选择 4096 位。
- 有效期: 建议设置为
1y或2y(1~2年),到期可续期,避免遗失后永久挂在公钥服务器上。 - 个人信息: 输入真实姓名与邮箱(建议与 GitHub/GitLab 邮箱一致)。
- 密码(Passphrase): 为你的私钥设置一个强密码。
2.2 查看与导出密钥
- 查看本地公钥列表:
gpg --list-keys - 查看本地私钥列表:
gpg --list-secret-keys - 导出公钥(可公开发布或发给朋友):
# 替换 your_email@example.com 为你的邮箱 gpg --armor --export your_email@example.com > public.key - 导出私钥(妥善备份,勿泄露):
gpg --armor --export-secret-keys your_email@example.com > private.key - 导入他人的公钥或自己的备份私钥:
gpg --import key_file.key
3. 文件加密与解密
假设你有一个名为 secret.txt 的敏感文件。
3.1 非对称加密(使用接收者的公钥)
如果你想把文件安全地发送给好友 Alice:
# -e 表示加密,-r 指定接收者的邮箱/用户ID,-a 输出 ASCII 文本格式
gpg -e -a -r alice@example.com secret.txt
生成文件:
secret.txt.asc(只有拥有alice@example.com私钥的人才能解密)。
3.2 对称加密(使用预共享密码)
如果只是想加密自己的本地文件,不需要指定公钥:
# 使用密码加密
gpg -c secret.txt
生成文件:
secret.txt.gpg
3.3 解密文件
无论是对称加密还是非对称加密,解密命令相同:
# 解密并保存为 original.txt
gpg -d secret.txt.asc > original.txt
4. 数字签名与验证
签名用于证明“文件确实由我发送”且“内容未被篡改”。
4.1 创建签名
- 分离签名(推荐): 生成一个独立的
.sig签名文件,原文件保持不变。gpg --detach-sign -a document.pdf # 生成 document.pdf.asc 签名文件 - 明文签名: 签名嵌入文本文件内部(适合邮件或文本公告)。
gpg --clearsign message.txt # 生成 message.txt.asc,内部包含原文和签名
4.2 验证签名
验证他人发送的文件是否有效:
# 验证分离签名
gpg --verify document.pdf.asc document.pdf
# 验证明文签名
gpg --verify message.txt.asc
5. 配置 Git 使用 GPG 签名(GitHub / GitLab)
在 Git 提交上打上 Verified(已验证)标记,是开发者的常见做法。
第 1 步:获取密钥 ID
运行以下命令获取长 Key ID:
gpg --list-secret-keys --keyid-format=long
在 sec 行找到类似 3AA5C34371567BD2 的 Hash(即你的 Key ID)。
第 2 步:配置 Git 全局参数
把密钥绑定到你的 Git 配置中:
git config --global user.signingkey 3AA5C34371567BD2
git config --global commit.gpgsign true
⚠️ 避坑提示:解决 Git 签名失败问题 很多新手在配置完成后,第一次执行
git commit时会遇到error: gpg failed to sign the data报错。这通常是因为 GPG 程序找不到弹窗让你输入密码的终端(TTY)。 解决办法: 在你的~/.bashrc或~/.zshrc文件末尾加入一行:export GPG_TTY=$(tty)然后执行source ~/.bashrc,再次 Commit 就一定会弹出密码输入框了!
第 3 步:上传公钥至 GitHub / GitLab
导出纯文本公钥:
gpg --armor --export 3AA5C34371567BD2
复制打印出的从 -----BEGIN PGP PUBLIC KEY BLOCK----- 开始的内容,粘贴到 GitHub/GitLab 的 Settings -> SSH and GPG keys 中。
6. 安全防范与最佳实践
警告:必须创建撤销证书(Revocation Certificate)
如果你的私钥不慎遗失或泄露,你需要向外界宣布该密钥失效。生成命令:gpg --output revoke.crt --gen-revoke your_email@example.com生成后请妥善保存在绝对安全的地方(如打印在纸上或存入加密 U 盘)。
- 严禁将私钥上传至任何网络平台或代码仓库。
- 定期备份
~/.gnupg目录(内含公私钥环及信任数据库)。 - 修改密钥有效期: 若密钥即将过期,可用
gpg --edit-key <Key-ID>进入交互界面,输入expire重置过期时间。