如何安全备份GPG私钥?

我发现了一个非常有趣的命令行密码管理器,叫做pass。 要使用它,你需要生成一个GPG2密钥对,并使用该工具帮助你将密码存储在GPG2加密的文件中。 为了加密文件(添加新密码),它使用公钥。 为了解密文件(检索存储的密码),它使用私钥,而私钥需要密码。 这个工具非常好用。 现在,既然这个工具存储了我所有的密码,我想备份所有这些数据,以防我的电脑崩溃,这样我就不会被锁在所有的在线账户之外。 这个工具与git集成得很好,所以我能够轻松地将.gpg文件推送到另一台计算机上的私有git仓库。据我所了解,如果没有私钥来解密这些文件,它们是无用的。 我的问题是:如何以安全的方式备份私钥和公钥,以便在需要时可以将"数据库"恢复到另一台机器上?我能否只是将公钥和私钥存储在我的git仓库中,然后在以后的某个时间点导入到另一台机器上?或者将私钥存储在私有的本地git仓库中是否被认为是不安全的做法?git仓库需要密码才能访问。私钥已加密,并且需要密码才能打开 - 这样存储是否安全?

我想象一下,如果你将私钥与保护的机密信息存储在一起,实际上会降低保护的强度到对称密钥的水平。那么为什么还要费心使用非对称加密呢?除非你可以无需密码短语进行插入...也许这已经足够好的理由了,只要对称部分是可靠的。 - Robert Cutajar
5个回答

将PGP私钥存储在版本控制系统中本身并不会带来任何重大的安全问题。将私钥存储在一个本地、私有(未发布的)git仓库中与将私钥存储在同一台计算机上但不在任何git仓库中相比,应该没有明显的安全影响。 我能想到的唯一问题是,以版本控制的方式存储私钥的话,除非你能够某种方式销毁旧的版本,否则密钥密码更改给你带来的保护效果可能要小得多。 以可能使他人能够访问密钥文件的方式存储私钥可能会带来自己的一套安全问题。在这种情况下,攻击者与您的密钥之间只有其密码强度。 认识到存储安全并不完美,尤其是在现代环境中,人们经常备份到云服务(字面意思是“别人的计算机”),我们通常用口令保护我们的秘密密钥。我相信,即使您例如运行gpg-agent,您也会这样做。 底线是,只要你的密码短语足够强大,即使将加密密钥文件的副本存储在他人的计算机上,也应该相对安全。 然而,这是一个很大的假设:大多数人的密码或密码短语在计算机破解尝试方面都相当差劲。GnuPG会尽力根据你提供的信息工作,但为了确保数据的可靠保护,你需要一个强大的密码短语,并且在导入私钥到git仓库之前就要设置好它。一旦密钥被导入,攻击者原则上可以攻击任何版本的密钥,如果他们有理由相信某个版本的密码短语质量较低,很可能会选择攻击那个版本。因此,请务必谨慎选择密码短语。我写了一篇关于如何处理密码的简要指南,其中包括一些建议,帮助你选择需要记住的密码或密码短语,你可能会觉得有用。

我最近一直在考虑一个类似的设置。在回答你的问题之前,让我指出一下我对此的疑虑。这在这里有详细解释。简而言之,当Pass调用GPG时,在底层执行了不必要的非对称(RSA/EC)加密。这是不必要的,因为这里没有不受信任的方。 这很令人恼火,因为非对称加密比对称加密更不具备未来性。例如,今天的非对称加密可以被足够大的量子计算机破解,但这样的计算机尚不存在。总的来说,与对称加密相比,非对称加密更依赖于我们不知道如何解决的"数学问题"。 为了减轻这个弱点,你至少可以将与Pass一起使用的GPG公钥也保持私有,因为例如(潜在的)量子攻击需要这个公钥:在这里查看

就你实际的问题而言,目前尚不清楚您是打算公开还是私密存储Git仓库(带有密码)。如果您想保持私密性,基本上可以按照您的需求进行操作,并将GPG私钥的安全性降低到备份仓库所在介质的安全性。然而,这可能会导致一个先有鸡还是先有蛋的问题:如果仓库是私有的,在发生崩溃时该如何找回它呢?换句话说,在发生“严重崩溃”时,必须首先找回某些东西。因此,您可能希望保持Git仓库的私密性,但以一种方式备份GPG密钥,使您能够首先独立于其他任何内容地检索。

离线备份解决方案有很多选择,例如律师、地下室等参见此处。但并非每个人都适合使用地下室,所以我建议一个在线解决方案:

  • 创建一个超级强密码短语,几年内不需要键入。建议:使用具有个人意义的短语的长而令人难忘的拼写错误,或者来自一本书,如果您需要查找它,副本不会用完。

  • 使用导出的GPG秘钥和可能的SSH凭据创建一个tar压缩包。

  • 对其进行对称加密,使用您的密码短语:gpg --symmetric --armor

  • 创建一个免费的Git托管账户。

  • 创建一个公开仓库,可以在没有凭据的情况下克隆。

  • 将加密和加装甲的tar压缩包放入其中。

在“严重崩溃”后检索它:

  • 启动Live USB。

  • 克隆公开仓库。

  • gpg --decrypt

对称密码短语将成为您抵御僵尸的主要保护措施。当涉及选择密码短语时,人们有时不肯给予您或匿名读者以利益的怀疑。但是,具有良好密码短语的对称加密应该是可靠的。

当您导出GPG私钥时,它将使用自己的密码短语进行加密。最近版本的GPG不允许未加密的导出。您可以在此处使用您的“常规”GPG密码短语。只需记住,在发生崩溃的情况下,您需要两个密码短语才能访问您的GPG私钥。

另一个我使用的选项是:将您的密钥打印在纸上。 详细信息请参阅链接的答案。最大的优点是:您可以轻松将其存储在任何您想要的地方,并通过观察来检查它是否仍然处于良好状态。但最大的优势是:没有人能够在未实际身处您备份存储位置并拿走的情况下对其进行黑客攻击。

1就我所见,在这种情况下,纸质文件与可移动媒体相比没有任何优势,并且有一个不利之处,即如果您需要恢复密钥,您必须输入所有密钥的乱码。 - MAP
优点是,它更耐用,你可以用肉眼检查是否仍然可读,而无需使用计算机。如果我每用一张软盘、光盘或DVD出现不可恢复的数据错误就能得到一美元,我就能用这笔钱去度假了。你不需要输入任何内容!PaperBack会将其打印为带有纠错码的二维码。你只需扫描或拍照,程序就会将其还原成之前你提供给它打印的内容。 - Josef
当然,假设你们仍然拥有这样的技术。 - MAP
1嗯,在我看来,我可以在20年内很容易地获得一台带有Windows虚拟机或具备Wine软件的Linux,并下载那个开源软件的副本的概率要远高于能够获取用于读取软盘/光盘/DVD的硬件的概率。假设我是在1990年这样做的。现在,我甚至可以用我的浏览器运行当时的软件。但愿你好运,尝试用现代电脑读取5 1/4英寸软盘。 - Josef

另一种答案是“离线”,即将其存储在某个安全且未连接到任何计算机的地方。我在银行的保险箱里保存着所有密钥的完整、未加密副本(我已经这样做很长时间了,现在已经成为一种习惯),它们保存在软盘上。我之所以在银行的介质上将它们保持未加密状态,是因为“丢失”密钥的一个潜在情况是忘记了口令(我的口令通常包含很多奇怪的标点符号和拼写方式,忘记其中之一就无法使用)。我从未不得不从该副本恢复密钥,但我预先为最坏的情况做好了准备。

此外,介质上还有密钥吊销记录和一张说明如何处理它的纸条,以防我无法再提供帮助的情况。


如果您备份了主签名私钥,那么它不就可以用来生成撤销证书吗?在什么情况下备份撤销证书是有用的? - Matei David
啊,是的,但你必须明白,我无法确定执行请求的人对计算机的熟练程度如何(请注意,不是我会使用它,而是“我的继承人”)。因此,已经生成撤销文件并附上“只需发送带有此文件附件的电子邮件”的说明,这样就不太可能被管理不善。 - MAP
@MateiDavid 在您最初创建密钥对时生成并存储撤销证书,可以在密钥不可用时撤销该密钥。有一些合理的情况下可能会发生这种情况。当然,您必须非常小心地保护撤销证书,因为任何人拿到它后都可以发布它,从而撤销您的密钥对。虽然我不太确定撤销证书如何适用于OP的情况。 - user
是的,我们已经走进了一个麻烦的境地。很抱歉,我提到撤销证书只是为了完整地描述我所采取的步骤,并与原问题无关。 - MAP