# 前言

前几天看到了「皓子的小站」博主发的一篇博文「请一定要回复博客下的匿名评论!对于博主和评论者有关匿名评论的倡议」并与博主交流之后,发现目前博客广泛使用的匿名评论系统有严重的冒用风险,

即:游客只需要填写邮箱但很多评论系统并没有验证所填邮箱的所有权

如果冒充者知道了被冒充者的邮箱与平时所使用的昵称,则完全可以在其他博主评论区下冒充被冒充者进行恶意评论。

而如果使用 PGP 对评论内容进行 PGP 签名,则可以很好的解决这个问题。

虽然可以通过让评论系统支持发送邮箱验证码来进行所有权验证,但 PGP 可以在不便于登录邮箱的时候使用(需要搭配物理安全密钥使用)

# 开始

# Windows

在 Windows 上,我们可以通过 Keloparta 进行这个操作。(安装 gpg4win 附带)

PGP 密钥的前期准备等工作这里不再阐述了,网络上已有大量相关教程。

打开 Keloparta ,选择 记事本 ,接着点击 收件人 ,这里我们将 为我加密为他人加密 取消勾选,仅使用签名功能,否则别人因为没有私钥而无法看见我们想要发送的内容。

2024-04-24_012730

完成上面步骤后即可返回 记事本 ,将自己想要签名的内容输入在记事本内,然后点击 签名记事本 ,输入私钥的密码完成签名,最后就会获得类似于下面的一串文字:

1
2
3
4
5
6
7
8
9
10
11
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

你好,世界!
-----BEGIN PGP SIGNATURE-----

iHUEARYKAB0WIQSv0kw6czJN3BZXPkeOV9gL83kUUAUCZifwkQAKCRCOV9gL83kU
UFf2AP9lUkDs7nkLjYWlgeBHdPtNY6I6Cahlq9r0mcz/j0loywEAtPvJJ6fhU4+I
kXMofjb7oJi7/FxPV3w2e8JNsSqqtAk=
=LSP5
-----END PGP SIGNATURE-----

大家可以试试验证签名(公钥在 Me 页面)

PGP SIGNED MESSAGE 部分为你刚刚填写需要被签名的内容, PGP SIGNATURE 部分则为签名。

校验签名也很简单,首先将对方的公钥导入 Keloparta ,此步骤非常重要,关系着签名是否可信!!!

因此一定要从信任来源下载对方的签名(例如博主提供的具有 TLS 加密(HTTPS)的下载链接),毕竟 PGP 需要自己维护信任链,因此信任链的构建十分重要(不像 SSL 证书可以依赖上游 CA 证书机构)。

导入证书时也最好校验一下对方公钥的指纹是否和对方所提供的信息一致,否则千万不要导入!!!

导入完成后将带有签名的信息复制进 记事本 ,然后点击 解密/验证记事本内容 ,验证通过则会显示 有效的签名 并显示由谁签名,如下图:

2024-04-24_014113

信任等级可以由自己设定,因为是我自己的公钥所以肯定设置为绝对信任。

经过签名的信息哪怕有 1byte 的修改都会导致校验失败,例如我将中文的 改为英文的 ! ,经过校验后将会显示下图:

2024-04-24_014327

想要篡改信息的唯一办法就是对修改后的信息重新签名,而重新签名则需要私钥,因此需要妥善保管好私钥!!!(有条件可以买一个物理安全密钥,国产的 CanoKey 也就一百多块钱,不仅认证方便安全性也很高)

一旦私钥泄露请尽快吊销原 PGP 公钥,否则可能会被他人冒用!!!

# Linux

# Desktop

桌面版的 Linux 也有 kleopatra,操作方式和 Windows 版的大同小异。

# CLI(不推荐)

不建议在虚拟机或远程系统中使用智能卡,可能会出现无法识别智能卡的情况。

# 签名

使用智能卡可能需要先安装 scdaemon

1
sudo apt install scdaemon

然后重启 gpg-agent

1
pkill gpg-agent

如果不重启代理可能会出现 gpg: selecting card failed: No such device

不使用智能卡则无需关心上面步骤。

首先准备一个文件用来存放想要签名的文本

1
touch test

创建完成后将想要签名的文本写入文件

1
nano test

这里看自己喜好,vim,vi 也行

签名:

1
gpg --clearsign test

输入密码完成签名后将会在当前文件夹下生成一个 test.asc 文件

1
cat test.acs

即可查看已签名的内容

1
2
3
4
5
6
7
8
9
10
11
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

你好,世界!
-----BEGIN PGP SIGNATURE-----

iHUEARYIAB0WIQSv0kw6czJN3BZXPkeOV9gL83kUUAUCZijOAwAKCRCOV9gL83kU
UM7KAQDdGVFfmSsUEvYbPqZrzdT8wzxnKvSsQ/ig5sAGiBBaWgD9HN1ITOM1LdUt
hs6vesTKl9IeoEeY9VsN6vc1zlJ+KQY=
=l+wN
-----END PGP SIGNATURE-----
# 验证

首先导入对方的公钥

1
gpg --import [公钥文件]

然后将对方带有签名的文本保存在一个文件中,这里以 test.acs 作为演示

输入以下命令进行校验:

1
gpg --verify test.asc

校验成功将会出戏下方类似文字:

gpg: Signature made Wed 24 Apr 2024 05:16:51 PM CST
gpg: using EDDSA key AFD24C3A73324DDC16573E478E57D80BF3791450
gpg: Good signature from "GoodBoyboy (Main Key) " [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 7B49 3862 FEFB 5A10 B875 4458 391C C423 AEFF 3B06
Subkey fingerprint: AFD2 4C3A 7332 4DDC 1657 3E47 8E57 D80B F379 1450
gpg: WARNING: not a detached signature; file ‘test’ was NOT verified!

这里因为我使用的新的 Linux 机器所以没设置信任公钥,输入下面命令可以对该公钥进行编辑:(可选)

1
2
3
gpg --edit-key [Key的ID]

gpg> trust

然后会让你选择信任等级

因为是我自己的密钥,所以我选择等级为 5 的绝对信任

1
2
3
4
5
6
7
8
9
10
11
12
Please decide how far you trust this user to correctly verify other users' keys
(by looking at passports, checking fingerprints from different sources, etc.)

1 = I don't know or won't say
2 = I do NOT trust
3 = I trust marginally
4 = I trust fully
5 = I trust ultimately
m = back to the main menu

Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y