2

GPGME 使用一种passphrase_cb方法从用户那里获取密码以进行操作,这些操作需要访问私钥。这个回调只能被对称加密覆盖,在所有其他情况下,使用默认的 pinentry。

所有这些努力似乎都让人很不舒服,特别是因为 GPGME 是一个 API,它应该用于编程 C/C++/... 应用程序。在某些情况下,如果可以将密码短语直接传递给加密/签名函数,可能会更容易(对于想要使用 GPGME 的程序员)。我还看到 OpenPGP(更准确地说是 NetPGP)的其他实现使用回调。

所以我想知道是否有任何特定的安全理由这样做?

4

1 回答 1

2

GnuPG 从 2.1 开始将最关键的私钥功能移除到 .gnuPG 中gpg-agent,以减少对最私密的秘密——私钥的攻击面。

这样的回调不仅会向您正在编写的应用程序公开密码(这可能意味着比 GnuPG 更大的攻击面),而且 GnuPG 也会知道密码。

如果您确实需要控制应用程序中密码的输入,您有多种选择。

实施 Pinentry

信息流将是:您的应用程序通过 GPGME 调用 GnuPG,GnuPG 向 请求一些私钥操作gpg-agent,这再次要求您的应用程序提供密码。请注意,这仅在您还gpg-agent使用适当的 pinentry 配置启动时才有效(您可能必须启动另一个实例,与系统上已经运行的实例分开)。

gpg-preset-passphrase

直接传递密码的最重要用例是在无头守护程序中,没有人等待输入密码。GnuPG 还带来了一个小实用程序gpg-preset-passphrase(在 Debian 和衍生产品上,它被安装为/usr/lib/gnupg2/gpg-preset-passphrase),它也可以用于预缓存密码(因此在可配置的时间内不会查询它)。

Pinentry 环回

在 GnuPG 2.1 中,添加了另一个选项:在 中,您可以使用该选项gpg-agent允许 pinentry 环回。在 GnuPG/GPGME 中设置allow-loopback-pinentry的附加参数应该允许您再次使用密码短语交互。pinentry-modeloopbackpassphrase_cb

但是:考虑到这暴露了密码短语而不是您的应用程序和 GnuPG,并且可能被证明是一个(可能很小但存在并且可能不必要的)安全风险。此外,GnuPG 2.1 尚未广泛传播,如果您不控制环境,这可能是一个问题。

于 2016-01-28T15:18:57.343 回答