数字签名与时间戳实践指南

📜 数字签名与时间戳实践指南

Personal Guide for Digital Signing and Timestamping by
Geoffrey Chen

(适用于文件认证、学术作品归档及长期数字存证)


🪶 一、导言与目标

本文档说明如何为文章或项目文件生成 数字签名区块链时间戳证明,并介绍如何安全地 管理、延长或撤销 GPG 密钥

目标包括:
1. 证明文件确由作者本人签署(身份真实性);
2. 证明文件在某一时间点前已存在(时间真实性);
3. 确保密钥安全、长期可控且可验证。


🧰 二、环境准备

1. 安装工具

brew install gnupg opentimestamps-client    # macOSsudo apt install gnupg opentimestamps-client # Ubuntu / Debian

2. 确认 GPG 密钥

gpg --list-secret-keys

若已在 keys.openpgp.org
上传并验证,则可直接使用现有密钥。

3. 生成新的密钥对与导出保存

若你尚未创建密钥对,可执行以下命令生成:

gpg --full-generate-key

系统将依次询问:
– 密钥类型:建议选择 RSA and RSA(默认)
– 密钥长度:输入 4096
– 有效期:建议输入 2y0(永不过期)
– 用户名与邮箱:与验证身份一致
– 口令:务必设置强密码

生成完成后可查看:

gpg --list-secret-keys

导出公钥(用于验证):

gpg --armor --export <你的邮箱> > public.asc

导出私钥(仅本人留存):

gpg --armor --export-secret-keys <你的邮箱> > private.asc

将上述两个文件复制至 加密U盘 或 LifeVault
专用分区:

cp public.asc private.asc /Volumes/YourUSB/

⚠️ 建议:
– 公钥可公开发布(例如上传到 keys.openpgp.org)。
– 私钥仅保存在离线加密介质中。
– 复制后,可在系统中删除明文文件:
bash rm private.asc


🪙 三、文件签名与时间戳操作

假设要签名的文件为 article.md

1. 生成数字签名

gpg --output article.md.asc --detach-sign article.md
  • 生成独立签名文件 .asc,不修改原文。
  • 签名使用本地私钥,无需上传任何数据。

2. 生成区块链时间戳

ots stamp article.md
  • 生成 .ots 文件,仅包含文件哈希(不可逆指纹)。
  • 时间戳将在数小时后锚定至比特币区块链。

3. 验证签名与时间戳

gpg --verify article.md.asc article.mdots verify 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 -r 2025-10-22-example-article.zip 2025-10-22-example-article/

🔍 五、KeyID 与指纹管理

现代版本 GnuPG 默认显示完整
指纹(Fingerprint),KeyID 为其末 16 位。

1. 查看 KeyID

gpg --list-keys --keyid-format LONG

示例输出:

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 --output revoke.asc --gen-revoke <KeyID>

请将 revoke.asc 文件
离线保存(加密U盘或 LifeVault)。

若未来密钥遗失或泄露:

gpg --import revoke.ascgpg --send-keys <KeyID> --keyserver keys.openpgp.org

导入后,公钥会被标记为“revoked”,验证时将显示为失效。


🧱 七、私钥与撤销证书存储建议

文件 用途 推荐位置
私钥 日常签名与解密 本机 GPG 默认目录 ~/.gnupg/ 或加密备份盘
撤销证书 (revoke.asc) 紧急撤销密钥使用 离线介质(U盘、LifeVault、保险箱)
  • 私钥必须设置 强口令保护
  • 撤销证书应离线保存,并注明对应指纹。
  • 若使用 LifeVault,请采用不同密码与密钥分区。

若必须同时保存

zip key_and_revoke.zip private.asc revoke.ascgpg -c --cipher-algo AES256 key_and_revoke.zip

保留加密后的 .gpg 文件并删除明文。

风险说明

若两者同时泄露,攻击者可伪造签名并撤销你的身份,
因此最安全策略是 分开保存、不同密码、不同介质


🗃 八、长期存档与验证

  1. 所有 Markdown 文件使用 UTF-8 (无 BOM)
  2. 备份多份:本地、云端、冷存储。
  3. 每隔几年重新生成时间戳,维持连续性。
  4. 签名后文件保持不变。
  5. .zip 归档存入 LifeVault。

验证命令:

gpg --verify article.md.asc article.mdots verify article.md

🔒 九、验证声明
(Verification Statement) 示例模板

以下为 验证声明 (Verification Statement)
示例模板,
用于展示一篇签名文件在发布时应附带的验证信息格式。
本示例仅供参考,并非本文件自身的实际签名记录


(这里是文章的正文部分,省略)

🔍 验证方式

gpg --verify article.md.asc article.mdots verify 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.

Leave a Reply