如何在互联网上证明一个人?GPG 签名如何证明身份

1. 分离签名(Detached Signature)—— 最常用

签名单独存为一个文件,原文件保持不变。推荐用于软件发布、分发脚本等场景。

生成签名

gpg --detach-sign --armor 文件名
  • --detach-sign:生成分离签名
  • --armor:输出 ASCII 文本格式(.asc),否则为二进制格式(.sig

执行后生成:文件名.asc(例如 myfile.txt.asc

验证签名

gpg --verify 文件名.asc 文件名

正确输出应包含:Good signature from "..."

:white_check_mark: 优点:原文件无需改动;接收方可直接使用原文件 + 签名单独验证。
:warning: 注意:必须同时提供原文件和签名文件才能验证。


2. 清签名(Clear Signature)—— 人类可读

将原文和签名混合在一个文本文件中,原文部分保持明文可读。适合声明、邮件、配置文件。

生成签名

gpg --clear-sign 文件名

输出文件:文件名.asc,内容形如:

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

原文内容,不加密。
-----BEGIN PGP SIGNATURE-----
...
-----END PGP SIGNATURE-----

验证签名

gpg --verify 文件名.asc

会自动提取原文内容并验证。

:white_check_mark: 优点:可直接用文本编辑器打开看到原文;无需额外携带签名文件。
:cross_mark: 限制:仅适用于文本文件,二进制文件会乱码。


3. 普通签名(附签)—— 不推荐单独用

将签名与原文打包成一个二进制或文本文件,但无法直接阅读原文。较少用于“单文件签名”。

gpg --sign 文件名          # 生成二进制 .gpg 文件
gpg --sign --armor 文件名  # 生成文本 .asc 文件

验证并恢复原文:

gpg --output 原文件名 --decrypt 签名文件.gpg

:cross_mark: 缺点:需要解密步骤才能得到原文;不适合原文件已公开的场景。


实操示例(分离签名 + 验证)

# 创建一个测试文件
echo "我的身份声明" > statement.txt

# 生成分离签名(ASCII 格式)
gpg --detach-sign --armor statement.txt
# 得到 statement.txt.asc

# 模拟发送:将 statement.txt 和 statement.txt.asc 发给对方

# 对方验证
gpg --verify statement.txt.asc statement.txt

如果签名有效,你会看到:
gpg: Good signature from "Your Name <you@example.com>"


常见问题

  • 验证时报 “Can’t check signature: No public key”
    对方没有你的公钥。需要先导出并发送公钥:
    gpg --armor --export 你的KeyID > mypubkey.asc

  • 验证时提示 “WARNING: This key is not certified with a trusted signature!”
    这仅表示对方尚未对你的公钥进行信任标记,不影响签名有效性本身(只要显示 Good signature)。

  • 我想对一个二进制文件(如图片、压缩包)签名
    用分离签名模式(第一种)最合适,无需关心文件格式。


根据你的具体用途选择:

  • 给别人发文件 + 验证出处 ➔ 分离签名
  • 发可读声明/配置 ➔ 清签名
  • 需要加密 + 签名(保密且防伪)➔ 用 --encrypt --sign(不在本问题范围内)

如果需要更具体的自动化脚本或集成到 CI/CD,可以补充说明。

1 Like