由于大多数密钥类型可以用于多种目的,即认证,身份验证,加密和签名,因此人们可以简单地对所有内容使用一个密钥-这是一个坏主意,例如托马斯·波宁(Thomas Pornin)。因此,一个人应该针对不同的目的使用不同的密钥对,并使用不同的备份方法(解密应该“永远”保持可能,而签名密钥可以“简单”被替换)并确保安全。但是我还没有找到总结最佳答案的最佳实践的总结报告:


应将哪种类型的密钥用于什么目的(RSA ,DSA,...多少位,它们何时到期等)?
所有密钥应该是认证主密钥的(单独的)子密钥,还是前者签名的单个主密钥?我找到了一些有关如何从日常使用的子密钥中删除秘密主密钥的重要指南,但与完全独立的认证密钥相比,值得花更短的信任链来解决麻烦的问题是?
当使用a)“真正”强密码短语或b)诸如OpenPGP卡之类的硬件设备时,使认证密钥保持脱机实际上实际上有多重要?


#1 楼

关于使用子键

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

使用多个主键的示例:


您不想混合使用私钥和专业密钥
,您需要一些与您的“现实生活”身份无关的密钥。在被当局起诉时

使用子密钥的示例:


您想对多个设备使用多个密钥(因此不必撤销计算机的密钥如果您丢失了手机,则会丢失密钥)
您希望定期(例如,每隔几年)切换密钥,而又不会在Trust of Web中失去声誉。

我最近发布了有关多少OpenPGP密钥的信息

关于密钥大小

GnuPG开发人员建议使用2k RSA密钥进行加密和签名。

由于您的主键除了用于键签名和验证签名(当然还有撤销)之外,不会被用于其他任何用途,因此,将其视为一个很好的做法是相当好的。巨大的密钥,同时使用较小的大小(足够大的时间,您将需要它们)用于子密钥(这将加快计算速度并减小文件的大小)。

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

密钥到期

有两种方式可以破坏私钥:


有人可以从您那里窃取它
有人可以从您的公钥中重新计算它

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

密钥的有效期会将密钥的有效性限制在您期望密钥安全的给定时间内。此后任何破解它的攻击者将仅能读取发送给您的加密数据,但没有人会再使用它。如果攻击者掌握了您的密钥,而您却未被注意,那么至少在一定时间后它将阻止他使用它。

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

离线存储主密钥

您的主键是最关键的。所有的信任-传入和传出-都与此相关。如果有人可以访问它,他就可以:


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


当一个人使用a)“真正”强密码短语时,保持认证密钥脱机实际上有多重要? />

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

使主(专用)密钥保持脱机状态是防止这些问题的一个不错的选择。它包括一些麻烦,但如上所述会降低风险。

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


b)诸如OpenPGP卡之类的硬件设备?


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

您可以将公钥存储在任意位置,为了真正使用OpenPGP,您甚至应该将其(以及其他公钥)发送到密钥服务器。


并且不要忘记创建并打印您的主键撤销证书。丢失没有此证书的私钥意味着有一个密钥,您将无法再在密钥服务器上徘徊,并且对此也无能为力。

打印它,可能多次,然后将其放入到您信任的地方。您的父母,一些银行存款箱,...-如果此证书泄漏,最糟糕的事情就是丢失了您的信任网。

#2 楼

仅当您可以预测某个时间点(由于科学,技术的进步或您对保护私钥的兴趣不足)导致密钥将不再安全时,密钥到期才有意义。给定的非对称密钥将来是否会变弱取决于对未来计算能力增加(只能模糊地预测)和新的科学发现(根本无法预测)的估计。为了提高计算能力,各种研究人员和机构团体都发布了带有预测方程的建议;请访问此网站进行良好的调查。请记住,尽管这些建议中包含了大量的科学知识和有根据的猜测,但它们的预测成功率并不一定比他们宰羊和看其肝脏来阐明众神的意志要好。

无论如何,通常的假设是,在以下情况下2048位RSA密钥至少应保持到2030年,并且可能更长一些:


使用加密安全的PRNG正确生成。 (据信GnuPG可以正确使用OS资源,但直到Debian出现严重故障时,OpenSSL才被正确使用)。
没有数学家找到整数分解的致命捷径(最近的主要进步是发现了General Number Field Sieve) 1989年;从那时起,研究就集中在许多小的累积优化上;当前记录为768位。
计算机一直在我们所知的物理定律下运行,尤其是量子计算机仅是理论上的(建立了一些QC,但当前记录似乎是8位整数的因式分解)。

尽管这些情况中的任何一种将来都可能会失败,但是无法以任何种类的准确性来预测失败的时间,因此您无法围绕这些错误设计关键的过期策略。您可以做的最好的事情就是假设它们不会发生,并祈求最好的事情。

DSA和ElGamal钥匙对于相同的钥匙长度提供相似的阻力;即2048位也应该很好。

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

您的主密钥应该是大部分保持离线状态。如果您的主密钥受到非常强大的密码短语的保护,则可以将其存储在任何地方,尤其是在线计算机中。但是,当您键入该密码短语时,必须确保当时使用的计算机是“干净的”,并且不会与键盘记录程序和其他有害的附件混在一起。主密钥是“重要的”(至少对您而言),您真的不想看到它被盗。不能保证拥有100%保证的“在线”计算机已参与日常的与Internet相关的活动。

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

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

评论


关于Y2k38的要点...但是,无论如何,听起来25年对于主键来说是一个合理的时间跨度。那么OpenPGP卡(可能带有专用PIN键盘)是否算作离线?

– Tobias Kienzler
13年2月27日在13:59

专用的PIN垫是一个好举动:即使计算机上充满病毒和恶意软件,它也应抵抗敌对的劫持。但是,使用主密钥时,无论使用PIN键盘如何,都看不到密钥签名的内容。 OpenPGP卡就像使用非常随机的密码进行加密一样,意味着只要您不输入PIN或密码,密钥就很安全。但是当您这样做时,一切都会进行。

–托马斯·波宁(Thomas Pornin)
13年2月27日在14:04

#3 楼

菜谱
,这是一个菜谱方法,例证了上面的答案。它是“生成更安全的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

这将生成一个仅签名的子密钥。

(对加密和身份验证子密钥重复此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

这使它们处于“笔记本”状态te缺少主密钥。
通过
$ 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


评论


-1。不回答问题,在没有经验的用户中推广不安全的做法(粘贴而不是理解命令)。

–债务
16年7月26日在10:26



@berbt:感谢您的反馈。您认为步骤正确,但是不喜欢演示文稿,对吗?

– serv-inc
16 Jul 26'11:40



不,不是。这里总结的步骤省略了博客文章中描述的绝大多数背景和安全信息。由于菜谱通常是由初学者遵循的,他们可能不会做进一步的研究(否则他们将不会遵循菜谱),因此他们将跳过在安全环境中创建和存储密钥的整个过程。

–债务
16年7月26日在19:28

作为偶尔使用PGP的用户,我非常感谢您介绍的菜谱风格。我不同意@berbt,因为大多数初学者会在了解所有内容之前就放弃。因此给他们一个食谱只会帮助他们。如果他们有足够的兴趣首先使用PGP,他们肯定会查找所示的一些内容。

–not2qubit
17年5月9日在20:31