我试图了解验证分离的 gpg 签名时会发生什么。
这是 gnupg 中的一个示例手动的:
blake% gpg --verify doc.sig doc
gpg: Signature made Fri Jun 4 12:38:46 1999 CDT using DSA key ID BB7576AC
gpg: Good signature from "Alice (Judge) <[email protected]>"
gpg如何判断签名是好的?签名是否包含已签名文件的哈希值?如果是这样,如何从签名本身中提取该哈希值?
我尝试过gpg --list-packets <signature>
,但似乎没有显示完整信息。
答案1
您可以使用该--list-packets
选项来转储 gpg 文件中的内容。文件格式的描述是RFC 4880(OpenPGP 标准)。
签名不直接包含哈希值。它包含允许验证哈希值和发送者的信息:有一个签名验证算法,它将哈希值和公钥作为输入,并返回是的或者不;算法返回是的如果签名是由与给定公钥对应的私钥(来自具有给定私钥的消息)进行的,则返回不在所有其他情况下(不同散列的签名、不同密钥生成的签名或一堆根本不能成为签名的字节)。在下面DSA算法,我认为如果没有私钥,则无法从签名中提取哈希值。
签名文件包含签名者的身份以及签名值。为了验证签名,gpg 从您的密钥环中读取签名者的公钥,计算数据的哈希值,并应用签名验证算法。
答案2
$ gpg --list-packets myfile.asc
[...]
digest algo 10, begin of digest 77 dd
这显示了使用了哪种摘要算法。不幸的是,手册页也没有gpg --version
告诉我们哪种算法分配给哪个 ID。我们需要深入研究数据包格式的 RFC 才能找到此信息:https://www.rfc-editor.org/rfc/rfc4880#section-9.4
ID Algorithm Text Name
-- --------- ---------
1 - MD5 [HAC] "MD5"
2 - SHA-1 [FIPS180] "SHA1"
3 - RIPE-MD/160 [HAC] "RIPEMD160"
4 - Reserved
5 - Reserved
6 - Reserved
7 - Reserved
8 - SHA256 [FIPS180] "SHA256"
9 - SHA384 [FIPS180] "SHA384"
10 - SHA512 [FIPS180] "SHA512"
11 - SHA224 [FIPS180] "SHA224"
100 to 110 - Private/Experimental algorithm
答案3
是的,数字签名通常是安全哈希值,由签名者的密钥进行签名。
对整个消息进行签名要慢得多,而且并不更安全。此外,算法应该考虑块的长度、填充(以不泄露太多信息的方式)等。
注意:同样在非对称加密上,出于速度原因,只有临时对称密钥是非对称加密的,其余消息只是对称加密的。