📜 数字签名与时间戳实践指南
Personal Guide for Digital Signing and Timestamping by
Geoffrey Chen
(适用于文件认证、学术作品归档及长期数字存证)
🪶 一、导言与目标
本文档说明如何为文章或项目文件生成 数字签名 与区块链时间戳证明,并介绍如何安全地 管理、延长或撤销 GPG 密钥。
目标包括:
1. 证明文件确由作者本人签署(身份真实性);
2. 证明文件在某一时间点前已存在(时间真实性);
3. 确保密钥安全、长期可控且可验证。
🧰 二、环境准备
1. 安装工具
brewinstall gnupg opentimestamps-client# macOSsudoapt install gnupg opentimestamps-client# Ubuntu / Debian
2. 确认 GPG 密钥
gpg--list-secret-keys
若已在 keys.openpgp.org
上传并验证,则可直接使用现有密钥。
3. 生成新的密钥对与导出保存
若你尚未创建密钥对,可执行以下命令生成:
gpg--full-generate-key
系统将依次询问:
– 密钥类型:建议选择 RSA and RSA(默认)
– 密钥长度:输入 4096
– 有效期:建议输入 2y 或 0(永不过期)
– 用户名与邮箱:与验证身份一致
– 口令:务必设置强密码
生成完成后可查看:
gpg--list-secret-keys
导出公钥(用于验证):
gpg--armor--export<你的邮箱>>public.asc
导出私钥(仅本人留存):
gpg--armor--export-secret-keys<你的邮箱>>private.asc
将上述两个文件复制至 加密U盘 或 LifeVault
专用分区:
cppublic.asc private.asc /Volumes/YourUSB/
⚠️ 建议:
– 公钥可公开发布(例如上传到 keys.openpgp.org)。
– 私钥仅保存在离线加密介质中。
– 复制后,可在系统中删除明文文件:
bash rm private.asc
🪙 三、文件签名与时间戳操作
假设要签名的文件为 article.md:
1. 生成数字签名
gpg--outputarticle.md.asc--detach-signarticle.md
- 生成独立签名文件
.asc,不修改原文。 - 签名使用本地私钥,无需上传任何数据。
2. 生成区块链时间戳
otsstamp article.md
- 生成
.ots文件,仅包含文件哈希(不可逆指纹)。 - 时间戳将在数小时后锚定至比特币区块链。
3. 验证签名与时间戳
gpg--verifyarticle.md.asc article.mdotsverify article.md.ots
验证通过即代表内容未改动,且在指定时间之前已存在。
📦 四、保存与目录结构
完成签名与时间戳后,建议将所有相关文件放入独立的归档文件夹中,命名格式可为:
YYYY-MM-DD-标题或项目名/
📁 推荐目录结构
2025-10-22-example-article/
├── article.md ← 原文(UTF-8,无 BOM)
├── article.md.asc ← GPG 签名文件
├── article.md.ots ← 时间戳文件
├── verification_block.md ← 验证信息(可附在发布页)
└── archive_note.txt ← 归档说明(作者、时间、用途)
🔸 建议将该文件夹整体压缩为
.zip,并保存在
LifeVault、外接硬盘及云端各一份。
🔸.zip压缩包内的文件应保持只读状态,不再修改。
🔸 对每份归档可额外生成 SHA256 校验文件:
bash shasum -a 256 article.md > sha256.txt
示例压缩命令:
zip-r2025-10-22-example-article.zip 2025-10-22-example-article/
🔍 五、KeyID 与指纹管理
现代版本 GnuPG 默认显示完整
指纹(Fingerprint),KeyID 为其末 16 位。
1. 查看 KeyID
gpg--list-keys--keyid-formatLONG
示例输出:
pub rsa4096/EFGH1234567890AB 2024-03-12 [SC]
uid [ultimate] 你的名字 <你的邮箱地址>
指纹示例:
12345678901234567890ABCDEFGH1234567890AB
→ KeyID:EFGH1234567890AB
KeyID 通常用于签名、撤销、延长有效期等命令参数。
🔑 六、密钥维护与安全策略
1. 延长公钥有效期
gpg--edit-key<你的邮箱或KeyID>expiresavegpg--send-keys<KeyID>--keyserver keys.openpgp.org
2.
生成与使用撤销证书(Revoke Certificate)
gpg--outputrevoke.asc--gen-revoke<KeyID>
请将 revoke.asc 文件
离线保存(加密U盘或 LifeVault)。
若未来密钥遗失或泄露:
gpg--importrevoke.ascgpg--send-keys<KeyID>--keyserver keys.openpgp.org
导入后,公钥会被标记为“revoked”,验证时将显示为失效。
🧱 七、私钥与撤销证书存储建议
| 文件 | 用途 | 推荐位置 |
|---|---|---|
| 私钥 | 日常签名与解密 | 本机 GPG 默认目录 ~/.gnupg/ 或加密备份盘 |
| 撤销证书 (revoke.asc) | 紧急撤销密钥使用 | 离线介质(U盘、LifeVault、保险箱) |
- 私钥必须设置 强口令保护。
- 撤销证书应离线保存,并注明对应指纹。
- 若使用 LifeVault,请采用不同密码与密钥分区。
若必须同时保存
zipkey_and_revoke.zip private.asc revoke.ascgpg-c--cipher-algoAES256 key_and_revoke.zip
保留加密后的 .gpg 文件并删除明文。
风险说明
若两者同时泄露,攻击者可伪造签名并撤销你的身份,
因此最安全策略是 分开保存、不同密码、不同介质。
🗃 八、长期存档与验证
- 所有 Markdown 文件使用 UTF-8 (无 BOM)。
- 备份多份:本地、云端、冷存储。
- 每隔几年重新生成时间戳,维持连续性。
- 签名后文件保持不变。
- 将
.zip归档存入 LifeVault。
验证命令:
gpg--verifyarticle.md.asc article.mdotsverify article.md
🔒 九、验证声明
(Verification Statement) 示例模板
以下为 验证声明 (Verification Statement)
示例模板,
用于展示一篇签名文件在发布时应附带的验证信息格式。
本示例仅供参考,并非本文件自身的实际签名记录。
(这里是文章的正文部分,省略)
- 签名文件:
article.md.asc - 时间戳文件:
article.md.ots - 公钥验证:https://keys.openpgp.org/search?q=你的邮箱地址
- 指纹
(Fingerprint):1234 ABCD 5678 EFGH 1234 ABCD 5678 ABCD BBCC
🔍 验证方式
gpg--verifyarticle.md.asc article.mdotsverify article.md
验证成功即表明:
1. 文件内容未被修改;
2. 签名者身份真实;
3. 文件存在时间早于区块链记录。
🗒️ 说明
若你希望为自己的文件添加真实的签名与时间戳,请参照本文前述章节:
“三、文件签名与时间戳操作” 及 “四、保存与目录结构”。
📜 版本信息
Version: 2025-10-22
Maintained by: Geoffrey Chen
Discover more from Geoffrey Chen
Subscribe to get the latest posts sent to your email.