短 OpenPGP 密钥 ID 不安全,如何配置 GnuPG 以使用长密钥 ID?

信息安全 密钥管理 pgp gnupg
2021-09-03 15:50:37

短 OpenPGP 密钥 ID(具有 32 位/8 个十六进制字符)容易受到冲突攻击强烈建议停止使用 32 位 ID

停止使用 32 位密钥 ID

在 GPU 上生成一个冲突的 32 位密钥 ID 需要 4 秒(使用scallion)。密钥服务器对上传的密钥几乎没有验证,并允许具有冲突 32 位 id 的密钥。此外,GPG 在其整个界面中使用 32 位密钥 ID,并且不会在操作可能适用于多个密钥时向您发出警告。

但是我如何告诉 GnuPG 使用长 ID(64 位或 16 个十六进制字符)?

1个回答

指纹与长短键 ID 的关系如何

每个 OpenPGP 密钥都附有一个指纹,主要根据其公钥数据包计算得出,该数据包还包含创建时间。该计算在RFC 4880、OpenPGP、12.2 中定义。密钥 ID 和指纹

有短密钥和长密钥 ID,它们类似于指纹的低 32 个相应的 64 位。例如,查看我的 OpenPGP 密钥的 ID:

fingerprint: 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279
long id:                                    4E1F 799A A4FF 2279
short id:                                             A4FF 2279

使用指纹和密钥 ID,因为共享和比较通常为 1024 到 8096 位的整个密钥(为诸如创建日期之类的标头添加更多)是非常不切实际的。

使用长密钥 ID

每当指定 OpenPGP 密钥时,您不仅可以传递短密钥 ID,还可以传递长密钥 ID 甚至整个指纹。而不是传递短键 ID

gpg --recv-keys A4FF2279

你总是可以写长密钥ID

gpg --recv-keys 4E1F799AA4FF2279

甚至是完整的指纹(推荐用于脚本和类似目的)

gpg --recv-keys 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279

打印长键 ID

但是从哪里获取长密钥 ID?如果有人通过了他的短 ID,您只能尝试获取该 ID 的所有密钥,并查看是否存在冲突(并希望没有人向您隐藏真正的密钥,只传递伪造的密钥)。

因此,每当交出您的 OpenPGP 密钥 ID 时,请公布长 ID!您可以通过添加以下--keyid-format long选项轻松地使 GnuPG 打印这个:

gpg --keyid-format long --list-keys email@jenserat.de

此选项采用值short0xshort用于短键 ID(不带或带有0x前缀以指示它是十六进制数字)和long0xlong用于长键 ID。

将长密钥 ID 配置为默认值

要确保 GnuPG始终打印长密钥 ID,请在~/.gnupg/gpg.conf文件中添加选项以去除--. 例如,我已将 GnuPG 配置为始终0x通过添加一行打印 -prefixed long key ID

keyid-format 0xlong

打印指纹

遗憾的是,您不能将 GnuPG 设置为以这种方式打印整个指纹,可能是因为它会破坏 GnuPG 对于几乎所有屏幕尺寸的输出格式。相反,通过运行请求它

gpg --fingerprint 4E1F799AA4FF2279

这将转储类似

pub   8192R/0x4E1F799AA4FF2279 2012-12-25
      Key fingerprint = 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279

由于这具有包含空格的缺点(在脚本中使用它的坏事),您可以使用冒号分隔的机器可读输出代替:

gpg --with-colons --fingerprint 4E1F799AA4FF2279

要过滤除指纹以外的所有内容,请另外使用grepand cut

gpg --with-colons --fingerprint 4E1F799AA4FF2279 | grep fpr | cut -d ':' -f 10