什么是好的通用 GnuPG 密钥设置?

信息安全 密钥管理 pgp
2021-08-30 07:07:11

由于大多数密钥类型可以用于多种用途,即认证、身份验证、加密和签名,因此可以简单地将一个密钥用于所有事情——这是一个主意,正如Thomas Pornin所阐述的那样。所以人们应该为不同的目的使用不同的密钥对,使用不同的备份方法(解密应该“永远”保持可能,而签名密钥可以“简单地”被替换)和保护。但我还没有找到一篇总结以下问题答案的最佳实践的综合文章:

  • 什么类型的密钥应该用于什么目的(RSA、DSA、......多少位,它们应该何时到期等)?
  • 所有密钥都应该是(单独的?)认证主密钥的子密钥还是由前一个签名的单独的主密钥?我找到了一些关于如何从日常使用的子密钥中删除秘密主密钥的重要指南,但是与完全独立的证书密钥相比,所涉及的问题真的值得对这些密钥建立更短的信任链吗? ?
  • 当一个人使用 a)“真正”强密码或 b)像 OpenPGP 卡这样的硬件设备时,使认证密钥保持离线实际上有多重要?
3个回答

关于使用子项

为您需要的每个身份使用一个主键,否则使用子键。

使用多个主键的示例:

  • 您不想混淆您的私钥和专业密钥
  • 您需要一些与您的“现实生活”身份无关的密钥,例如被当局起诉时

使用子键的示例:

  • 您想为多个设备使用多个密钥(因此,如果您丢失了手机,则不必撤销计算机的密钥)
  • 您希望定期(例如,每隔几年)更换密钥,而不会失去您在信任网络中的声誉

我最近在另一个答案中发布了关于要制作多少个 OpenPGP 密钥的信息。

关于密钥大小

GnuPG 开发人员建议使用2k RSA 密钥进行加密和签名。这对于当前使用的子键绝对没问题。

由于您的主密钥仅用于密钥签名和验证签名(当然还有撤销),因此在此处拥有一个相当大的密钥被视为一种好习惯,同时使用较小的尺寸(足够大,足以让您有时间需要它们)对于子键(这将加快计算速度并减少文件大小)。

对于 Superuser 的另一个问题,我对RSA 和 DSA/Elgamal 有更详细的回答,请去那里进一步阅读。

密钥过期

有两种方式可能会泄露私钥:

  1. 有人可以从你那里偷走它
  2. 有人能够从你的公钥重新计算它

首先是您计算机的安全问题(以及如何使用您的密钥,请阅读下文),其次是时间问题。今天(可能是未来几年),RSA 2k 密钥将完全没问题。但是计算能力急剧上升,因此攻击者需要更少的 CPU 内核/显卡/计算机/发电厂来重新计算您的私钥。此外,在使用的算法中可能会出现故障,从而导致所需的计算能力大大减少。量子计算机可以进一步加快速度。

密钥到期日期会将您的密钥的有效性限制在您希望它安全的给定时间。之后任何攻击者破解它,将只能读取发送给你的加密数据,但没有人会再使用它;如果攻击者掌握了您的密钥并且您没有被注意到,那么至少它会阻止他在给定时间后使用它。

使您的主密钥过期将使您失去所有信任网络的声誉,但如果您失去访问权限,至少会在给定时间后使您的密钥失效(永远不会发生的事情,请在我的答案末尾继续阅读)。

离线存储主键

你的主键是最关键的。所有的信任——无论是传入的还是传出的——都与此相关。如果有人可以访问它,他能够:

  • 使用您的姓名创建新密钥(默认情况下,GnuPG 始终使用您最新的子密钥!)
  • 撤销子键和主键
  • 向其他密钥发出信任,这是最糟糕的事情:攻击者可以创建一个新密钥,从您的旧密钥中获得信任,然后撤销您的旧密钥,使您无法访问您的“移动”身份 - 他实际上是超越你的身份

当使用 a) “真正”强密码 [...] 时,使认证密钥保持离线实际上有多重要?

您的计算机总是可能被某些恶意软件攻击或感染,下载您的密钥并安装密钥记录器以获取您的密码(这与您使用的操作系统无关,所有这些都包含目前没人知道的严重安全漏洞)。

使您的主(私有)密钥脱机是防止这些问题的好选择。它包括一些麻烦,但如上所述降低了风险。

最高的安全性当然意味着使用单独的离线计算机(硬件,没有虚拟机!)使用您的主密钥进行所有密钥管理,并且仅使用一些拇指驱动器传输 OpenPGP 数据(您发出的外键和签名)。

b) 像 OpenPGP 卡这样的硬件设备?

OpenPGP 智能卡介于将其离线存储在拇指驱动器上、将其连接到您的计算机以进行签名和使用另一台专门用于此目的的离线计算机之间。您的私钥永远不会离开需要“管理员 PIN”的智能卡(备份目的除外),所有签名甚至密钥创建都将在卡内进行。“使用”您的密钥(加密、签名、给予信任)只需要一个“用户 PIN”,因此即使您将卡连接到“受损”计算机,攻击者也无法完全超越您的 ID。

您可以将您的公钥存储在任何您想要的地方,为了真正使用 OpenPGP,您甚至应该将它(和您的其他公钥)发送到密钥服务器。


并且不要忘记创建和打印主密钥的撤销证书。丢失没有此证书的私钥意味着密钥服务器上存在您无法访问的密钥,并且您对此无能为力

打印它,可能多次,然后把它放在你信任的地方。你的父母,一些银行存款箱,...... - 如果这个证书泄露,最糟糕的事情就是失去你的信任网络。

仅当您可以预测由于科学、技术的进步或您对保护私钥缺乏兴趣而导致密钥将不再安全的时间点时,密钥过期才有意义。给定的非对称密钥在未来是否会变弱取决于对未来计算能力增长的估计(这只能模糊地预测)和新的科学发现(根本无法预测)。对于计算能力,各种研究人员和机构机构已经发布了预测方程的建议;看到这个网站为了一个好的调查。请记住,虽然这些建议中包含了大量科学和明智的猜测,但它们的预测成功率并不一定比他们屠宰一只羊并观察它的肝脏来解开众神的意志要好。

无论如何,通常的假设是,在以下条件下,2048 位 RSA 密钥应该至少能保持到 2030 年,甚至可能更长:

  • 密钥是使用加密安全的 PRNG正确生成的(GnuPG 被认为可以正确使用操作系统资源,但 OpenSSL 也是如此,直到Debian 大失所望)。
  • 没有数学家找到整数分解的致命捷径(最后一个重大进展是 1989 年发现了通用数域筛;从那时起,研究一直集中在许多小的累积优化上;目前的记录是768 位)。
  • 计算机继续按照我们所知道的物理定律运行,特别是,量子计算机继续只是理论上的(建立了一些 QC,但目前的记录似乎是 8 位整数的因式分解)。

虽然这些条件中的任何一个在未来都可能失败,但无法以任何准确度预测失败的时间,因此您无法围绕它们设计密钥过期策略。你能做的最好的就是假设它们不会发生,并为最好的祈祷。

DSA 和 ElGamal 密钥对相同的密钥长度具有相似的抵抗力;即这些的 2048 位也应该没问题。

从更实际的角度来看,您应该将到期日期保持在 2038 年之前

您的主密钥应保持大部分处于脱机状态如果您的主密钥受到非常强大的密码保护,那么它可以存储在任何地方,尤其是在线计算机中。但是,当您输入该密码时,您必须确保您当时使用的机器是“干净的”并且没有充满键盘记录器和其他邪恶的附加组件。万能钥匙是“重要的”(至少对您而言),您真的不想看到它被盗。一台“在线”并参与日常互联网相关活动的计算机不能被认为是 100% 保证干净的。

因此,只要在专用的离线计算机上使用,存储在您的计算机、智能手机、Gmail 帐户......就可以了。您应该只使用您的主密钥来发出子密钥,即最多十年一次。这引发了密码短语的另一个问题:十年后,您将如何记住您从未输入过的密码短语?

为了获得真正好的弹性,我建议打印主密钥文件(Base64 编码),然后用铅笔在同一张纸上写下密码(不要使用打印机!),并将其存储在银行保险箱中最糟糕的是,如果十年后您丢失了文件忘记了密码,您仍然可以输入它并恢复您的主密钥。

食谱

这是一个食谱方法,它举例说明了上面的好答案。它是生成更安全的 GPG 密钥的精简版:分步指南,将所有这些功能分成单独的密钥

创建主键

$ gpg --expert --gen-key

(8) RSA(设置自己的能力)

Your selection? 8

(S) 切换签名功能

Your selection? s

(E) 切换加密功能

Your selection? e

(Q) 完成

Your selection? q

What keysize do you want? (2048) 4096
Key is valid for? (0) 3y
Is this correct? (y/N)y

接下来添加 UID、电子邮件和密码。

这会生成一个仅认证的主键

创建签名(等)子密钥

$ gpg --expert --edit-key john.doe@example.com
gpg> addkey

(8) RSA(设置自己的能力)

Your selection? 8
Your selection? e
Your selection? q

What keysize do you want? (2048) 3072
Key is valid for? (0) 6m
Is this correct? (y/N)y
Really create? (y/N) y

这会生成一个仅签名子项。

(对 Encryption 和 Authentication 子密钥重复此 addkey 过程)

[...]

完成后,我们会将密钥保存到我们的密钥环中。

gpg> save

备份

$ gpg -a --export-secret-key john.doe@example.com > secret_key
$ gpg -a --gen-revoke john.doe@example.com > revocation_cert.gpg

删除主键

$ gpg -a --export-secret-subkeys john.doe@example.com > secret_subkeys.gpg
$ gpg --delete-secret-keys john.doe@example.com
Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y
$ gpg --import secret_subkeys.gpg

这使它们处于“笔记本电脑”状态,缺少主密钥。转移是通过

$ gpg -a --export-secret-keys john.doe@example.com > laptop_keys_secret.gpg
$ gpg -a --export john.doe@example.com > laptop_keys_public.gpg

(通过 USB-Stick 或 CD 传输)和笔记本电脑上

$ gpg --import laptop_keys_public.gpg
$ gpg --import laptop_keys_secret.gpg