短 OpenPGP 密钥 ID(具有 32 位/8 个十六进制字符)容易受到冲突攻击。强烈建议停止使用 32 位 ID:
停止使用 32 位密钥 ID
在 GPU 上生成一个冲突的 32 位密钥 ID 需要 4 秒(使用scallion)。密钥服务器对上传的密钥几乎没有验证,并允许具有冲突 32 位 id 的密钥。此外,GPG 在其整个界面中使用 32 位密钥 ID,并且不会在操作可能适用于多个密钥时向您发出警告。
但是我如何告诉 GnuPG 使用长 ID(64 位或 16 个十六进制字符)?
短 OpenPGP 密钥 ID(具有 32 位/8 个十六进制字符)容易受到冲突攻击。强烈建议停止使用 32 位 ID:
停止使用 32 位密钥 ID
在 GPU 上生成一个冲突的 32 位密钥 ID 需要 4 秒(使用scallion)。密钥服务器对上传的密钥几乎没有验证,并允许具有冲突 32 位 id 的密钥。此外,GPG 在其整个界面中使用 32 位密钥 ID,并且不会在操作可能适用于多个密钥时向您发出警告。
但是我如何告诉 GnuPG 使用长 ID(64 位或 16 个十六进制字符)?
每个 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 位的整个密钥(为诸如创建日期之类的标头添加更多)是非常不切实际的。
每当指定 OpenPGP 密钥时,您不仅可以传递短密钥 ID,还可以传递长密钥 ID 甚至整个指纹。而不是传递短键 ID
gpg --recv-keys A4FF2279
你总是可以写长密钥ID
gpg --recv-keys 4E1F799AA4FF2279
甚至是完整的指纹(推荐用于脚本和类似目的)
gpg --recv-keys 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
但是从哪里获取长密钥 ID?如果有人通过了他的短 ID,您只能尝试获取该 ID 的所有密钥,并查看是否存在冲突(并希望没有人向您隐藏真正的密钥,只传递伪造的密钥)。
因此,每当交出您的 OpenPGP 密钥 ID 时,请公布长 ID!您可以通过添加以下--keyid-format long选项轻松地使 GnuPG 打印这个:
gpg --keyid-format long --list-keys email@jenserat.de
此选项采用值short或0xshort用于短键 ID(不带或带有0x前缀以指示它是十六进制数字)和long或0xlong用于长键 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