实验:WSL 环境下的 GPG 私钥迁移与数字签名
PUBLISHED:
实验:WSL 环境下的 GPG 私钥迁移与数字签名
在开发环境迁移的过程中,GPG 密钥的安全转移与有效性验证是构建可信计算环境的基础环节。本文记录了将 GPG 密钥对从 Fedora 物理机备份后迁移至 WSL Ubuntu 的完整操作流程,并通过构造文件篡改实验,验证了数字签名在保障数据完整性与不可否认性上起到的重要作用。
导出并备份 GPG 密钥对
1. 配置文件全量备份
用 tar 打包整个 GPG 配置目录:
# 进入家目录并打包 .gnupg 文件夹
tar -czvf gnupg_conf_backup_$(date +%F).tar.gz ~/.gnupg
2. 导出信任库
为了在恢复后不需要手动重新设定“绝对信任”,执行以下导出命令:
gpg --export-ownertrust > gpg_ownertrust_backup.txt
3. 导出公钥与吊销证书
Armor 格式公钥方便分发,密钥吊销证书用于私钥泄露后的应急处理。
# 导出 Armor 格式公钥 (pubkey.asc)
gpg --armor --export zhangzw0170@gmail.com > pubkey.asc
# 生成吊销证书 (revoke.asc)
gpg --gen-revoke zhangzw0170@gmail.com > revoke.asc
4. 纸质冷备份(Paperkey)
使用 paperkey 工具生成 my_paper_key.txt,该工具只提取私钥中最重要的部分,减小了备份体积,方便打印在纸上:
# 使用 paperkey 提取私钥核心数据
gpg --export-secret-key zhangzw0170@gmail.com | paperkey --output my_paper_key.txt
5. 私钥二维码备份
备份中的 my_secret_qr.png 说明你当时还做了移动端恢复的准备。通常是先将私钥转换为文本(Base64 或 ASCII),然后用 qrencode 生成:
gpg --armor --export-secret-key zhangzw0170@gmail.com | qrencode -o my_secret_qr.png
导入并还原 GPG 密钥对
1. 密钥文件的物理迁移与权限收紧
恢复备份后,需确保权限符合 GPG 安全模型要求。
# 严格收紧目录与文件权限
chmod 700 ~/.gnupg
find ~/.gnupg -type f -exec chmod 600 {} +
find ~/.gnupg -type d -exec chmod 700 {} +
# 验证私钥加载情况
gpg -K
预期输出:
/home/user/.gnupg/pubring.kbx
------------------------------
sec ed25519/0xXXXXXXXXXXXXXXXX 2026-01-25 [SC] [expires: 2027-01-25]
Key fingerprint = XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX XXXX
uid [ultimate] NAME <email>
ssb cv25519/0xYYYYYYYYYYYYYYYY 2026-01-25 [E] [expires: 2027-01-25]
(注:sec 代表主私钥,ssb 代表加密子私钥,[ultimate] 表示信任层级已通过 ownertrust 恢复。)
2. 完整性校验实验
步骤 A:生成明文签名
echo "test" | gpg --clearsign > message.txt.asc
预期输出(文件内容):
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
test
-----BEGIN PGP SIGNATURE-----
iHUEARYIAB0WIQTVgbKU7hCAWFf1i/CjIGPbsfx8WwUCacym8QAKCRCjIGPbsfx8
...(Base64 编码的签名数据)
-----END PGP SIGNATURE-----
备注:WSL 下可能出现 ioctl 错误:
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
test
gpg: signing failed: Inappropriate ioctl for device
gpg: [stdin]: clear-sign failed: Inappropriate ioctl for device
修复方法如下:
echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
source ~/.bashrc
步骤 B:验证原始签名
gpg --verify message.txt.asc
预期输出:
gpg: Signature made Wed Apr 1 13:00:00 2026 CST
gpg: using EDDSA key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
gpg: Good signature from "NAME <email>" [ultimate]
步骤 C:尝试篡改内容并验证签名
手动将 message.txt.asc 中的明文 test 修改为 tost 后再次验证:
gpg --verify message.txt.asc
预期输出:
gpg: Signature made Wed Apr 1 13:00:00 2026 CST
gpg: using EDDSA key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
gpg: BAD signature from "NAME <email>" [ultimate]
(注:BAD signature 标志着完整性校验失败。)
3. 延伸讨论:经典密码学的边界与量子计算威胁
量子计算机的发展为经典密码学带来了新的威胁:
- 1994 年 Shor 算法提出,该算法利用量子傅里叶变换,将经典计算机上指数级时间的大整数分解难题降至多项式时间;
- 1996 年 Grover 算法提出,该算法利用振幅放大,将对称加密/哈希碰撞的时间从 $O(N)$ 降至 $O(\sqrt{ N })$。 尽管直到 2026 年,量子比特的简易制备与量子计算机的量产仍遥遥无期,不过当下学界与工业界已经开始推进后量子密码(PQC)的标准化,并探索其在底层硬件上加速实现的各类方法。
4. 应用:配置 Git 提交签名
git config --global user.signingkey "这里填入 Key fingerprint 的后 16 位 16 进制数,不需要带引号"
git config --global commit.gpgsign true
在任一 git 库提交后可在该目录下验证 Git 签名状态:
git log --show-signature -1
预期输出:
commit 87f... (HEAD -> master)
gpg: Signature made Wed Apr 1 13:10:00 2026 CST
gpg: using EDDSA key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
gpg: Good signature from "NAME <email>" [ultimate]
Author: NAME <email>
Date: Wed Apr 1 13:10:00 2026 +0800
feat: initial signed commit