我知道如何使用gpg验证,步骤如下:
$ gpg --verify somefile.sig
gpg: Signature made Tue 23 Jul 2013 13:20:02 BST using RSA key ID E1B768A0
gpg: Good signature from "Richard W.M. Jones <rjones@redhat.com>"
gpg: aka "Richard W.M. Jones <rich@annexia.org>"
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: F777 4FB1 AD07 4A7E 8C87 67EA 9173 8F73 E1B7 68A0
但我真正想做的是针对特定公钥文件验证文件。
这是程序的一部分,它从网站下载大文件,并需要在使用它们之前验证它们是否被篡改。网站将包含文件和签名。该程序将随附GPG公钥。当我上传文件到网站时,我将用相应的私钥进行签名(显然不会分发)。看起来该程序应该能够执行以下操作:
gpg --no-default-keyring --verify file.sig \
--is-signed-with /usr/share/program/goodkey.asc
但是gpg
没有像这样的选项。看起来唯一的方法是解析gpg
命令的输出,但这似乎非常不安全(其中包含由攻击者控制的文本)。
编辑:我不知道在这里回答自己的问题的礼仪是什么,但我找到的答案是使用--status-fd标志。此标志生成易于解析的输出,我可以检查所需指纹:
gpg --status-fd <N> --verify file.sig
在文件描述符N上产生:
[GNUPG:] SIG_ID rpG8ATxU8yZr9SHL+VC/WQbV9ac 2013-07-23 1374582002
[GNUPG:] GOODSIG 91738F73E1B768A0 Richard W.M. Jones <rjones@redhat.com>
[GNUPG:] VALIDSIG F7774FB1AD074A7E8C8767EA91738F73E1B768A0 2013-07-23 1374582002 0 4 0 1 2 00 F7774FB1AD074A7E8C8767EA91738F73E1B768A0
[GNUPG:] TRUST_UNDEFINED
这就是例如perl的GnuPG库如何工作的方式。