如果我在进程内存中同时有一条消息(M)和一个公钥(P),那么使用P加密M而不写入临时中间文件的方法是什么?
我有可能将两者都传递给stdin并使用一些棘手的协议gpg(2)支持从管道接受这两者吗?
如果不是 - 那将是php的其他选择(记住没有本机绑定并且使用第三方扩展是不可能的(它不在标准的ubuntu存储库中并且支持自定义构建和自定义存储库是太太多了))?
答案 0 :(得分:1)
我不相信这种机制存在。 GnuPG希望将密钥环作为文件来执行pubkey操作 - 我不相信它能够接受实际公钥进行一次性加密操作,而不会将它们放在密钥环中。
您首先必须将该公钥导入密钥环,然后将该密钥环位置传递给GnuPG - 换句话说,您必须能够将其写入某处。如果您不想将它们放在磁盘上,可以使用/dev/shm
,这是大多数Linux系统上的ramdisk。
答案 1 :(得分:1)
对于大部分内容,这是我similar question posted on Server Fault的回答。无法复制为跨站点重复项。
GnuPG要求您将要使用的所有密钥导入密钥环。
如果您不想将其导入普通密钥环,请使用另一个(临时)密钥环,甚至是临时GnuPG主目录(也将绕过任何配置)。如果您不想将密钥存储在硬盘上,请考虑使用memdisk。
将--primary-keyring temporary.gpg
设置为默认使用(并在必要时创建)临时密钥环。它将在您的GnuPG主目录中创建(默认为~/.gnupg/temporary.gpg
)。您的普通密钥环仍然可用,但进口将转到临时密钥环。根据需要删除它。
例如:
gpg --primary-keyring temporary.gpg --import key.asc
gpg --primary-keyring temporary.gpg --recipient 0xDEADBEEF --encrypt
rm ~/.gnupg/temporary.gpg # can be omitted, not loaded by default
这也将重置所有配置,并可能有助于测试一些东西。设置--homedir [folder]
或环境变量$GNUPGHOME
,导入密钥,执行任何操作,然后根据需要删除文件夹。
例如:
export GNUPGHOME=/tmp/gnupg # Or apply --homedir on each invocation
gpg --import key.asc
gpg --recipient 0xDEADBEEF --encrypt
rm -r $GNUPGHOME # Can be omitted
unset $GNUPGHOME
GnuPG对权限非常挑剔,您可能需要对$GNUPGHOME
文件夹应用更严格的权限才能执行所有操作。很可能是保留一些游乐场的选择 - $GNUPGHOME
。
GnuPG有一个官方的PHP PEAR模块,也是packaged for Ubuntu in the official repositories,我强烈建议使用这个模块而不是手动构建GnuPG接口。