什么是 OpenPGP/GnuPG 密钥 ID?

Par*_*hot 27 pgp gnupg

我了解密钥块本身以及密钥散列的效用,但我不知道为什么需要附加信息,因此我无法开始猜测附加信息的效用。

具体来说,

  • 它意味着什么,
  • 它在哪里使用,以及
  • (如何)给定公钥块可以确定吗?

它往往会被间接提及,这会导致混淆,因为spacewalk清楚地识别出了指纹和 ID 之间的差异,而Fedora 发布的一些 GPG 文档中包含了这句话

对于 KEYNAME,替换主密钥对的密钥 ID 或指纹,

这使得两者似乎有着相同的目的;但这没有意义,因为如果是这样的话,为什么你需要两者都开始呢?

Jen*_*rat 35

来自RFC 4880

V4 指纹是八位字节 0x99 的 160 位 SHA-1 哈希,后跟两个八位字节的数据包长度,然后是以版本字段开头的整个公钥数据包。Key ID 是指纹的低 64 位。

对于V3密钥,计算类似,只是省略了密钥长度。

换句话说,指纹是根据一个常数、数据包长度和最终公钥数据包的一部分计算出来的。关于链接的 RFC 中包含的内容(以及如何计算它)的进一步说明。

(长)密钥 id 由最低 64 位表示,用作完整指纹是一个不方便的长值。更常见的是,使用由最低 32 位组成的短密钥 id。这些短密钥 ID 通常被认为有很高的冲突机会,并且至少使用长 ID,如果不建议使用完整的指纹。

用几句话概括:

指纹是从公钥数据包计算出的哈希值。密钥 ID 是指纹的一部分:

Fingerprint: 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279
Long key ID:                                4E1F 799A A4FF 2279
Short key ID:                                         A4FF 2279
Run Code Online (Sandbox Code Playgroud)

有时,ID 会以0x十六进制值作为前缀。