一个文件的多个 pgp 签名

Several pgp signatures for one file

file.txt 登录 GnuPG 的基本选项是 file.txt.asc 签名。

在我们的工作流程中,我需要 file.txt 的几个签名 - 主要示例是 Author 签名和 Validator 签名。

GnuPG 的最佳用例是什么?我可以将两个签名存储在一个 asc 文件中吗?或者我需要处理两个文件 file.txt.authorname.ascfile.txt.checkername.asc ?或者别的什么?

将(所有)签名与内容存储在同一个文件中

你真的应该使用detached签名并将它们存储在单独的文件中(参见答案的第二部分)但是可以存储超过gpg 通过签署一份已签署的文件获得一个签名。

这假设:

  1. 人们在文档上签名有一个顺序,签名总是以相反的顺序被验证。

  2. 文档在每次签名之间从不更改。

假设我们有两个签名密钥:authorvalidatorauthor 总是在发送给验证器之前对文档进行签名,验证器在收到文档后对其进行签名:

作者 签署了他的文档 (doc.txt)

gpg -u author -a --clearsign doc.txt
# this results in a file called doc.txt.asc

验证器收到doc.txt.asc,检查它是否有作者的有效签名,并用他的密钥签名

gpg --verify doc.txt.asc
gpg -u validator -a --clearsign doc.txt.asc
# resulting in doc.txt.asc.asc

现在您有 doc.txt.asc.asc 个具有两个签名的文件。要验证两个签名,您必须执行以下操作:

gpg --decrypt doc.txt.asc.asc 1>authors-file.txt.asc
gpg --decrypt authors-file.txt.asc 1>original-file.txt

验证的顺序很重要。您可以使用此方法根据需要链接任意数量的签名,但在验证时必须遵循与签名完全相反的顺序。

注意:您可以使用--output-o)更改gpg的默认输出文件。


使用分离签名

分离签名的主要优点是您无需通过 gpg 传递文件即可获得原始文件(您仍然可以阅读明文签名的文件,但需要忽略签名混乱)。建议在构建多个分离签名时使用--output-o),当您需要查找特定签名时,良好的签名命名约定会很有帮助。

签名或验证发生的顺序对于分离签名并不重要,但我将保持与上一节相同的顺序。首先,作者 签署了他的文档 doc.txt:

gpg -u author -a -o doc.author.asc --detach-sig doc.txt

作者将文件doc.txtdoc.author.asc都发送给验证者,由验证者验证签名并自己签名:

gpg --verify doc.author.asc doc.txt
gpg -u validator -a -o doc.validator.asc --detach-sig doc.txt

这次您有 三个 个文件,而不是一个:doc.txtdoc.author.ascdoc.validator.asc。您可以通过以下方式逐一验证签名:

gpg --verify doc.author.asc doc.txt
gpg --verify doc.validator.asc doc.txt

验证的顺序并不重要,需要签署此文件的人可以随意按他们想要的顺序签署。

此方法的缺点是您以多个文件结尾,但优点(见下文)远远超过它。

这种情况下分离签名的优点是:

  1. 您可以允许人们在签名期间修改文件。您只需要该文件的所有版本,并且需要知道使用哪个版本的文件创建了哪些签名(是的,这需要一个适当的过程)。

  2. 如果文件有几十个人签名,你不需要每个人都确认它的来源(比如,如果30个签名中有10个签名匹配就足够了),你可以在接收前验证文件所有签名。如果某人正在度假并且他的密钥刚刚过期,这可能会有用。

  3. 在这里,我重复主要优点:原始文件没有混乱。原始文件可以按原样读取。这对于纯文本文件似乎没有吸引力,因为您可以在清晰的签名盔甲中阅读它们,但二进制格式通常不能那么容易地阅读。


减少文件数量

根据 M.Babcock 的评论,您可以从对 this question 的回答中看出,原始分离签名可以 cat 在一起,并且仍然以该格式进行验证。这是可能的,因为签名具有关于用于执行它的密钥的元数据。同样,可以使用 ASCII 装甲签名执行相同的操作。

例如,您可以执行此操作:

echo doc1 > doc1
echo doc2 > doc2
gpg -u author -a -o doc1.author.asc --detach-sig doc1
gpg -u validator -a -o doc1.validator.asc --detach-sig doc1
gpg -u author -a -o doc2.author.asc --detach-sig doc2
gpg -u validator -a -o doc2.validator.asc --detach-sig doc2
cat *.asc > allsigs.asc

并验证签名:

$ gpg --verify allsigs.asc doc1
gpg: Signature made Thu 16 Jun 2016 03:31:06 PM UTC using RSA key ID ........
gpg: Good signature from "Author <author@example.com>"
gpg: Signature made Thu 16 Jun 2016 03:31:22 PM UTC using RSA key ID ........
gpg: Good signature from "Validator <validator@example.com>"
gpg: Signature made Thu 16 Jun 2016 03:31:28 PM UTC using RSA key ID ........
gpg: BAD signature from "Author <author@example.com>"
gpg: Signature made Thu 16 Jun 2016 03:31:36 PM UTC using RSA key ID ........
gpg: BAD signature from "Validator <validator@example.com>"

$ gpg --verify allsigs.asc doc2
gpg: Signature made Thu 16 Jun 2016 03:31:06 PM UTC using RSA key ID ........
gpg: BAD signature from "Author <author@example.com>"
gpg: Signature made Thu 16 Jun 2016 03:31:22 PM UTC using RSA key ID ........
gpg: BAD signature from "Validator <validator@example.com>"
gpg: Signature made Thu 16 Jun 2016 03:31:28 PM UTC using RSA key ID ........
gpg: Good signature from "Author <author@example.com>"
gpg: Signature made Thu 16 Jun 2016 03:31:36 PM UTC using RSA key ID ........
gpg: Good signature from "Validator <validator@example.com>"

gnupg不知道签名是针对哪个文件进行的。因此,您将始终至少有 (<number of files> - 1) * <number of signers> 个错误签名(或者更多,如果没有某些签名者的 public 密钥)。没有简单的方法可以解决这个问题,gnupg 必须尝试每一个信号。尽管没有什么可以阻止您在输出上使用 grep -v

要验证某个用户是否签署了文件,您只需要出现一次 Good signature from <that user>