GnuPG中m couldBeAttendedBy as
登录的基本选项为file.txt
签名。
在我们的工作流程中,我需要file.txt.asc
的几个签名 - 主要示例是作者签名和验证者签名。
GnuPG的最佳用例是什么?我可以将这两个签名存储在一个file.txt
文件中吗?或者我需要处理两个文件asc
和file.txt.authorname.asc
?或其他什么?
答案 0 :(得分:7)
你真的应该使用detached
签名并将它们存储在单独的文件中(请参阅答案的第二部分)但是可以使用{{存储多个签名1}}签署已签名的文件。
这假定:
人们签署文件的顺序,签名将始终以相反的顺序进行验证。
每次签名之间都不会更改文档。
我们说我们有两个签名密钥: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
验证顺序并不重要,需要签署此文件的人可以按照他们想要的顺序自由签名。
这种方法的缺点是你有几个文件,但优点(见下文)远远超过它。
此场景的分离签名的优点是:
您可以允许用户在签名期间修改文件。您只需要文件的所有版本,并且需要知道哪个版本的文件签名(是的,需要一个程序)。
如果有数十人签署该文件,并且您不需要每个人都确认其来源(例如,如果30个签名中的10个匹配就足够了),您可以在接收所有签名之前验证该文件。如果某人正在度假并且他的钥匙刚过期,这可能会有用。
在这里,我重复一下主要优点:原始文件中没有杂乱。原始文件可以按原样读取。这对于纯文本文件似乎不太吸引人,因为你可以在一个明确的签名盔甲中阅读它们,但二进制格式通常不能那么容易阅读。
根据M.Babcock的评论,您可以从this question的答案中看到原始分离签名可以gpg --verify doc.author.asc doc.txt
gpg --verify doc.validator.asc doc.txt
在一起,并且仍然以该格式进行验证。这是可能的,因为签名具有关于用于执行它的键的元数据。此外,可以使用ASCII装甲签名执行相同的操作。
例如,您可以执行此操作:
cat
验证签名:
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>
必须尝试每一个信号。虽然没有什么能阻止你在输出上使用gnupg
。
要验证某个用户是否签署了某个文件,您只需要出现一次grep -v
。