OpenPGP 私钥本身是否受密码保护?

信息安全 密码学 加密 验证 pgp
2021-08-12 04:24:15

我知道每次使用 OpenPGP 密钥时都需要输入密码。这是通过软件实现完成的,还是协议固有的属性,因此是关键?

本质上,问题分解为:如果有人偷了我的私钥,他们可以在不知道(或破坏)我的密码的情况下使用它吗?

3个回答

您的 PGP 密钥可以不加密(没有密码),因此如果它被复制,它可以在没有密码的情况下使用。您的私钥的加密是规范所固有的(RFC 4880 - 请参阅“字符串到密钥”部分),并且无论何时您使用要求您的私钥密码的软件,它都会使用该密码进行实际解密. 大多数现代版本的软件都努力避免允许将用于未加密密钥或密码短语的内存交换到磁盘。

所以不,如果不知道或破坏您的密码,就无法使用您的私钥。

OpenPGP 消息格式描述了许多“消息”,它们是涉及密码算法的结构的序列化其中一些消息旨在作为电子邮件交换;当您发送“签名电子邮件”时,您必须使用您的私钥。生成的消息(发送到 SMTP 服务器的消息)不受存储在非瞬态介质上时所述私钥的格式化方式的影响。从这个意义上说,您可以“使用 OpenPGP”(发送和接收签名和加密的电子邮件),而无需存储“受密码保护”的私钥;OpenPGP 的要求是用户可以“拥有”一个私钥并在很长一段时间内“记住”它。私钥本身应该以高度机密性存储,因为这种机密性对于整个方案的安全性至关重要。用户私钥通常存储在一个文件中,使用从用户密码(PGP 中的“密码短语”)派生的对称密钥进行加密。不太常见但同样有效的是,私钥是否可以存储在智能卡等防篡改设备中,并通过专用 API(如 PKCS#11)进行访问;GnuPG支持 PKCS#11设备如何存储密钥取决于设备,但很少涉及使用密码派生密钥进行加密。

OpenPGP定义了用于存储序列化私钥的消息格式,特别是使用从密码派生的密钥的对称加密。因此,当 OpenPGP 实现希望将私钥存储为具有密码保护的文件时,它倾向于使用该特定的消息格式。使用这种格式允许在不同的实现之间传输私钥(“密钥环”)。

因此,尽管就在线消息而言,私钥的密码保护并不是声称“OpenPGP 支持”的强制性要求,但仍然建议使用,并且有一种“OpenPGP 批准”的方式来处理该密码保护,它具有可移植性的好处,然后是实际的实现。

不要忽视gpg-agent ...

杰夫的回答很好,涵盖了您主要谈论的内容。但是您的第一句话忽略了这样一个事实,即有多种方法可以使用您的 OpenPGP 密钥,而无需为每次使用输入密码。它允许您输入一次,然后使用一段时间,未加密地存储在 RAM 中。默认的“ttl”(生存时间)是保守的:5 分钟。正如@gilles 指出的那样,这会增加一些风险,但它仍不应出现在未加密的磁盘上。gpg-agent 作为 gnupg 2.0 的一部分出现,适用于 GUI 应用程序。请参阅 gpg-agent: Invoking GPG-AGENT - Using the GNU Privacy Guard,它还可以处理 ssh-agent 所做的 SSH 密钥访问任务。