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