一个文件的多个 pgp 签名
Several pgp signatures for one file
file.txt
登录 GnuPG 的基本选项是 file.txt.asc
签名。
在我们的工作流程中,我需要 file.txt
的几个签名 - 主要示例是 Author 签名和 Validator 签名。
GnuPG 的最佳用例是什么?我可以将两个签名存储在一个 asc
文件中吗?或者我需要处理两个文件 file.txt.authorname.asc
和 file.txt.checkername.asc
?或者别的什么?
将(所有)签名与内容存储在同一个文件中
你真的应该使用detached
签名并将它们存储在单独的文件中(参见答案的第二部分)但是可以存储超过gpg
通过签署一份已签署的文件获得一个签名。
这假设:
人们在文档上签名有一个顺序,签名总是以相反的顺序被验证。
文档在每次签名之间从不更改。
假设我们有两个签名密钥:author
和 validator
,author
总是在发送给验证器之前对文档进行签名,验证器在收到文档后对其进行签名:
作者 签署了他的文档 (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.txt
和doc.author.asc
都发送给验证者,由验证者验证签名并自己签名:
gpg --verify doc.author.asc doc.txt
gpg -u validator -a -o doc.validator.asc --detach-sig doc.txt
这次您有 三个 个文件,而不是一个:doc.txt
、doc.author.asc
和 doc.validator.asc
。您可以通过以下方式逐一验证签名:
gpg --verify doc.author.asc doc.txt
gpg --verify doc.validator.asc doc.txt
验证的顺序并不重要,需要签署此文件的人可以随意按他们想要的顺序签署。
此方法的缺点是您以多个文件结尾,但优点(见下文)远远超过它。
这种情况下分离签名的优点是:
您可以允许人们在签名期间修改文件。您只需要该文件的所有版本,并且需要知道使用哪个版本的文件创建了哪些签名(是的,这需要一个适当的过程)。
如果文件有几十个人签名,你不需要每个人都确认它的来源(比如,如果30个签名中有10个签名匹配就足够了),你可以在接收前验证文件所有签名。如果某人正在度假并且他的密钥刚刚过期,这可能会有用。
在这里,我重复主要优点:原始文件没有混乱。原始文件可以按原样读取。这对于纯文本文件似乎没有吸引力,因为您可以在清晰的签名盔甲中阅读它们,但二进制格式通常不能那么容易地阅读。
减少文件数量
根据 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>
。
file.txt
登录 GnuPG 的基本选项是 file.txt.asc
签名。
在我们的工作流程中,我需要 file.txt
的几个签名 - 主要示例是 Author 签名和 Validator 签名。
GnuPG 的最佳用例是什么?我可以将两个签名存储在一个 asc
文件中吗?或者我需要处理两个文件 file.txt.authorname.asc
和 file.txt.checkername.asc
?或者别的什么?
将(所有)签名与内容存储在同一个文件中
你真的应该使用detached
签名并将它们存储在单独的文件中(参见答案的第二部分)但是可以存储超过gpg
通过签署一份已签署的文件获得一个签名。
这假设:
人们在文档上签名有一个顺序,签名总是以相反的顺序被验证。
文档在每次签名之间从不更改。
假设我们有两个签名密钥:author
和 validator
,author
总是在发送给验证器之前对文档进行签名,验证器在收到文档后对其进行签名:
作者 签署了他的文档 (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.txt
和doc.author.asc
都发送给验证者,由验证者验证签名并自己签名:
gpg --verify doc.author.asc doc.txt
gpg -u validator -a -o doc.validator.asc --detach-sig doc.txt
这次您有 三个 个文件,而不是一个:doc.txt
、doc.author.asc
和 doc.validator.asc
。您可以通过以下方式逐一验证签名:
gpg --verify doc.author.asc doc.txt
gpg --verify doc.validator.asc doc.txt
验证的顺序并不重要,需要签署此文件的人可以随意按他们想要的顺序签署。
此方法的缺点是您以多个文件结尾,但优点(见下文)远远超过它。
这种情况下分离签名的优点是:
您可以允许人们在签名期间修改文件。您只需要该文件的所有版本,并且需要知道使用哪个版本的文件创建了哪些签名(是的,这需要一个适当的过程)。
如果文件有几十个人签名,你不需要每个人都确认它的来源(比如,如果30个签名中有10个签名匹配就足够了),你可以在接收前验证文件所有签名。如果某人正在度假并且他的密钥刚刚过期,这可能会有用。
在这里,我重复主要优点:原始文件没有混乱。原始文件可以按原样读取。这对于纯文本文件似乎没有吸引力,因为您可以在清晰的签名盔甲中阅读它们,但二进制格式通常不能那么容易地阅读。
减少文件数量
根据 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>
。