C++ 为什么GPGME/GnuPG使用pinentry输入密码?

C++ 为什么GPGME/GnuPG使用pinentry输入密码?,c++,gnupg,openpgp,gpgme,C++,Gnupg,Openpgp,Gpgme,GPGME使用passphrase\u cb方法从用户处获取密码,以进行需要访问私钥的操作。只有对称加密才能覆盖此回调,在所有其他情况下都使用默认的pinentry 所有这些工作似乎都很不舒服,特别是因为GPGME是一个API,它应该用于编程C/C++/。。。应用。在某些情况下,如果可以将密码短语直接传递给加密/签名函数,可能会更容易(对于希望使用GPGME的程序员而言)。我还看到OpenPGP的其他实现(更准确地说是NetPGP)使用回调 因此,我想知道这样做是否有任何特定于安全的原因?Gnu

GPGME使用
passphrase\u cb
方法从用户处获取密码,以进行需要访问私钥的操作。只有对称加密才能覆盖此回调,在所有其他情况下都使用默认的pinentry

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


因此,我想知道这样做是否有任何特定于安全的原因?

GnuPG从2.1开始,将最关键的私钥功能删除到了
gpg代理中,以减少对最私密的秘密——私钥的攻击

这样的回调不仅会将密码短语暴露给您正在编写的应用程序(这可能意味着比GnuPG更大的攻击面),而且GnuPG也会知道密码短语

如果您确实需要控制应用程序中密码短语的输入,您有几个选择

实施Pinentry 然后,信息流将是:您的应用程序通过GPGME调用GnuPG,GnuPG从
gpg代理
请求一些私钥操作,这将再次向您的应用程序请求密码短语。请注意,只有在您使用适当的pinentry配置启动了
gpg代理时(您可能需要启动另一个实例,与系统上已经运行的实例不同),此操作才会起作用

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

松垂环回 在gnupg2.1中,添加了另一个选项:在
gpg代理
中,可以使用
allow loopback pinentry
选项允许pinentry环回。GnuPG/GPGME中设置为
loopback
的附加参数
pinentry mode
应允许您再次使用
passphrase\u cb
处理密码短语交互


但是:认为这暴露了密码并不是你的应用程序和GNUPG,并且可能被证明是一个(可能是微小的但存在的和可能不必要的)安全风险。此外,GNUPG2.1尚未广泛推广,如果不控制环境,这可能会成为一个问题。

pinentry环回在技术上如何工作?我可以看到GPGME似乎有
GPGME\u set\u pinentry\u模式
(在ruby版本中,但我没有在中找到它)。此外,我目前没有直接访问GnuPG(仅通过GPGME)。如何在那里设置
allow loopback
选项?
allow loopback
gpg agent
中的一个选项,不能通过GPGME进行设置。也不能通过调用GnuPG来设置它。您必须为此编辑
gpg代理
配置,以告知代理允许降低密码短语安全性。